//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2021 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto/tree/main/CodeGenerator. DO NOT EDIT.

import Foundation
import SotoCore

extension ElasticLoadBalancingv2 {
    // MARK: Enums

    public enum ActionTypeEnum: String, CustomStringConvertible, Codable {
        case authenticateCognito = "authenticate-cognito"
        case authenticateOidc = "authenticate-oidc"
        case fixedResponse = "fixed-response"
        case forward
        case redirect
        public var description: String { return self.rawValue }
    }

    public enum AuthenticateCognitoActionConditionalBehaviorEnum: String, CustomStringConvertible, Codable {
        case allow
        case authenticate
        case deny
        public var description: String { return self.rawValue }
    }

    public enum AuthenticateOidcActionConditionalBehaviorEnum: String, CustomStringConvertible, Codable {
        case allow
        case authenticate
        case deny
        public var description: String { return self.rawValue }
    }

    public enum IpAddressType: String, CustomStringConvertible, Codable {
        case dualstack
        case ipv4
        public var description: String { return self.rawValue }
    }

    public enum LoadBalancerSchemeEnum: String, CustomStringConvertible, Codable {
        case `internal`
        case internetFacing = "internet-facing"
        public var description: String { return self.rawValue }
    }

    public enum LoadBalancerStateEnum: String, CustomStringConvertible, Codable {
        case active
        case activeImpaired = "active_impaired"
        case failed
        case provisioning
        public var description: String { return self.rawValue }
    }

    public enum LoadBalancerTypeEnum: String, CustomStringConvertible, Codable {
        case application
        case gateway
        case network
        public var description: String { return self.rawValue }
    }

    public enum ProtocolEnum: String, CustomStringConvertible, Codable {
        case geneve = "GENEVE"
        case http = "HTTP"
        case https = "HTTPS"
        case tcp = "TCP"
        case tcpUdp = "TCP_UDP"
        case tls = "TLS"
        case udp = "UDP"
        public var description: String { return self.rawValue }
    }

    public enum RedirectActionStatusCodeEnum: String, CustomStringConvertible, Codable {
        case http301 = "HTTP_301"
        case http302 = "HTTP_302"
        public var description: String { return self.rawValue }
    }

    public enum TargetHealthReasonEnum: String, CustomStringConvertible, Codable {
        case elbInitialhealthchecking = "Elb.InitialHealthChecking"
        case elbInternalerror = "Elb.InternalError"
        case elbRegistrationinprogress = "Elb.RegistrationInProgress"
        case targetDeregistrationinprogress = "Target.DeregistrationInProgress"
        case targetFailedhealthchecks = "Target.FailedHealthChecks"
        case targetHealthcheckdisabled = "Target.HealthCheckDisabled"
        case targetInvalidstate = "Target.InvalidState"
        case targetIpunusable = "Target.IpUnusable"
        case targetNotinuse = "Target.NotInUse"
        case targetNotregistered = "Target.NotRegistered"
        case targetResponsecodemismatch = "Target.ResponseCodeMismatch"
        case targetTimeout = "Target.Timeout"
        public var description: String { return self.rawValue }
    }

    public enum TargetHealthStateEnum: String, CustomStringConvertible, Codable {
        case draining
        case healthy
        case initial
        case unavailable
        case unhealthy
        case unused
        public var description: String { return self.rawValue }
    }

    public enum TargetTypeEnum: String, CustomStringConvertible, Codable {
        case instance
        case ip
        case lambda
        public var description: String { return self.rawValue }
    }

    // MARK: Shapes

    public struct Action: AWSEncodableShape & AWSDecodableShape {
        /// [HTTPS listeners] Information for using Amazon Cognito to authenticate users. Specify only when Type is authenticate-cognito.
        public let authenticateCognitoConfig: AuthenticateCognitoActionConfig?
        /// [HTTPS listeners] Information about an identity provider that is compliant with OpenID Connect (OIDC). Specify only when Type is authenticate-oidc.
        public let authenticateOidcConfig: AuthenticateOidcActionConfig?
        /// [Application Load Balancer] Information for creating an action that returns a custom HTTP response. Specify only when Type is fixed-response.
        public let fixedResponseConfig: FixedResponseActionConfig?
        /// Information for creating an action that distributes requests among one or more target groups. For Network Load Balancers, you can specify a single target group. Specify only when Type is forward. If you specify both ForwardConfig and TargetGroupArn, you can specify only one target group using ForwardConfig and it must be the same target group specified in TargetGroupArn.
        public let forwardConfig: ForwardActionConfig?
        /// The order for the action. This value is required for rules with multiple actions. The action with the lowest value for order is performed first.
        public let order: Int?
        /// [Application Load Balancer] Information for creating a redirect action. Specify only when Type is redirect.
        public let redirectConfig: RedirectActionConfig?
        /// The Amazon Resource Name (ARN) of the target group. Specify only when Type is forward and you want to route to a single target group. To route to one or more target groups, use ForwardConfig instead.
        public let targetGroupArn: String?
        /// The type of action.
        public let type: ActionTypeEnum

        public init(authenticateCognitoConfig: AuthenticateCognitoActionConfig? = nil, authenticateOidcConfig: AuthenticateOidcActionConfig? = nil, fixedResponseConfig: FixedResponseActionConfig? = nil, forwardConfig: ForwardActionConfig? = nil, order: Int? = nil, redirectConfig: RedirectActionConfig? = nil, targetGroupArn: String? = nil, type: ActionTypeEnum) {
            self.authenticateCognitoConfig = authenticateCognitoConfig
            self.authenticateOidcConfig = authenticateOidcConfig
            self.fixedResponseConfig = fixedResponseConfig
            self.forwardConfig = forwardConfig
            self.order = order
            self.redirectConfig = redirectConfig
            self.targetGroupArn = targetGroupArn
            self.type = type
        }

        public func validate(name: String) throws {
            try self.fixedResponseConfig?.validate(name: "\(name).fixedResponseConfig")
            try self.validate(self.order, name: "order", parent: name, max: 50000)
            try self.validate(self.order, name: "order", parent: name, min: 1)
            try self.redirectConfig?.validate(name: "\(name).redirectConfig")
        }

        private enum CodingKeys: String, CodingKey {
            case authenticateCognitoConfig = "AuthenticateCognitoConfig"
            case authenticateOidcConfig = "AuthenticateOidcConfig"
            case fixedResponseConfig = "FixedResponseConfig"
            case forwardConfig = "ForwardConfig"
            case order = "Order"
            case redirectConfig = "RedirectConfig"
            case targetGroupArn = "TargetGroupArn"
            case type = "Type"
        }
    }

    public struct AddListenerCertificatesInput: AWSEncodableShape {
        /// The certificate to add. You can specify one certificate per call. Set CertificateArn to the certificate ARN but do not set IsDefault.
        @CustomCoding<StandardArrayCoder>
        public var certificates: [Certificate]
        /// The Amazon Resource Name (ARN) of the listener.
        public let listenerArn: String

        public init(certificates: [Certificate], listenerArn: String) {
            self.certificates = certificates
            self.listenerArn = listenerArn
        }

        private enum CodingKeys: String, CodingKey {
            case certificates = "Certificates"
            case listenerArn = "ListenerArn"
        }
    }

    public struct AddListenerCertificatesOutput: AWSDecodableShape {
        /// Information about the certificates in the certificate list.
        @OptionalCustomCoding<StandardArrayCoder>
        public var certificates: [Certificate]?

        public init(certificates: [Certificate]? = nil) {
            self.certificates = certificates
        }

        private enum CodingKeys: String, CodingKey {
            case certificates = "Certificates"
        }
    }

    public struct AddTagsInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the resource.
        @CustomCoding<StandardArrayCoder>
        public var resourceArns: [String]
        /// The tags.
        @CustomCoding<StandardArrayCoder>
        public var tags: [Tag]

        public init(resourceArns: [String], tags: [Tag]) {
            self.resourceArns = resourceArns
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.tags.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArns = "ResourceArns"
            case tags = "Tags"
        }
    }

    public struct AddTagsOutput: AWSDecodableShape {
        public init() {}
    }

    public struct AuthenticateCognitoActionConfig: AWSEncodableShape & AWSDecodableShape {
        /// The query parameters (up to 10) to include in the redirect request to the authorization endpoint.
        @OptionalCustomCoding<StandardDictionaryCoder>
        public var authenticationRequestExtraParams: [String: String]?
        /// The behavior if the user is not authenticated. The following are possible values:   deny - Return an HTTP 401 Unauthorized error.   allow - Allow the request to be forwarded to the target.   authenticate - Redirect the request to the IdP authorization endpoint. This is the default value.
        public let onUnauthenticatedRequest: AuthenticateCognitoActionConditionalBehaviorEnum?
        /// The set of user claims to be requested from the IdP. The default is openid. To verify which scope values your IdP supports and how to separate multiple values, see the documentation for your IdP.
        public let scope: String?
        /// The name of the cookie used to maintain session information. The default is AWSELBAuthSessionCookie.
        public let sessionCookieName: String?
        /// The maximum duration of the authentication session, in seconds. The default is 604800 seconds (7 days).
        public let sessionTimeout: Int64?
        /// The Amazon Resource Name (ARN) of the Amazon Cognito user pool.
        public let userPoolArn: String
        /// The ID of the Amazon Cognito user pool client.
        public let userPoolClientId: String
        /// The domain prefix or fully-qualified domain name of the Amazon Cognito user pool.
        public let userPoolDomain: String

        public init(authenticationRequestExtraParams: [String: String]? = nil, onUnauthenticatedRequest: AuthenticateCognitoActionConditionalBehaviorEnum? = nil, scope: String? = nil, sessionCookieName: String? = nil, sessionTimeout: Int64? = nil, userPoolArn: String, userPoolClientId: String, userPoolDomain: String) {
            self.authenticationRequestExtraParams = authenticationRequestExtraParams
            self.onUnauthenticatedRequest = onUnauthenticatedRequest
            self.scope = scope
            self.sessionCookieName = sessionCookieName
            self.sessionTimeout = sessionTimeout
            self.userPoolArn = userPoolArn
            self.userPoolClientId = userPoolClientId
            self.userPoolDomain = userPoolDomain
        }

        private enum CodingKeys: String, CodingKey {
            case authenticationRequestExtraParams = "AuthenticationRequestExtraParams"
            case onUnauthenticatedRequest = "OnUnauthenticatedRequest"
            case scope = "Scope"
            case sessionCookieName = "SessionCookieName"
            case sessionTimeout = "SessionTimeout"
            case userPoolArn = "UserPoolArn"
            case userPoolClientId = "UserPoolClientId"
            case userPoolDomain = "UserPoolDomain"
        }
    }

    public struct AuthenticateOidcActionConfig: AWSEncodableShape & AWSDecodableShape {
        /// The query parameters (up to 10) to include in the redirect request to the authorization endpoint.
        @OptionalCustomCoding<StandardDictionaryCoder>
        public var authenticationRequestExtraParams: [String: String]?
        /// The authorization endpoint of the IdP. This must be a full URL, including the HTTPS protocol, the domain, and the path.
        public let authorizationEndpoint: String
        /// The OAuth 2.0 client identifier.
        public let clientId: String
        /// The OAuth 2.0 client secret. This parameter is required if you are creating a rule. If you are modifying a rule, you can omit this parameter if you set UseExistingClientSecret to true.
        public let clientSecret: String?
        /// The OIDC issuer identifier of the IdP. This must be a full URL, including the HTTPS protocol, the domain, and the path.
        public let issuer: String
        /// The behavior if the user is not authenticated. The following are possible values:   deny - Return an HTTP 401 Unauthorized error.   allow - Allow the request to be forwarded to the target.   authenticate - Redirect the request to the IdP authorization endpoint. This is the default value.
        public let onUnauthenticatedRequest: AuthenticateOidcActionConditionalBehaviorEnum?
        /// The set of user claims to be requested from the IdP. The default is openid. To verify which scope values your IdP supports and how to separate multiple values, see the documentation for your IdP.
        public let scope: String?
        /// The name of the cookie used to maintain session information. The default is AWSELBAuthSessionCookie.
        public let sessionCookieName: String?
        /// The maximum duration of the authentication session, in seconds. The default is 604800 seconds (7 days).
        public let sessionTimeout: Int64?
        /// The token endpoint of the IdP. This must be a full URL, including the HTTPS protocol, the domain, and the path.
        public let tokenEndpoint: String
        /// Indicates whether to use the existing client secret when modifying a rule. If you are creating a rule, you can omit this parameter or set it to false.
        public let useExistingClientSecret: Bool?
        /// The user info endpoint of the IdP. This must be a full URL, including the HTTPS protocol, the domain, and the path.
        public let userInfoEndpoint: String

        public init(authenticationRequestExtraParams: [String: String]? = nil, authorizationEndpoint: String, clientId: String, clientSecret: String? = nil, issuer: String, onUnauthenticatedRequest: AuthenticateOidcActionConditionalBehaviorEnum? = nil, scope: String? = nil, sessionCookieName: String? = nil, sessionTimeout: Int64? = nil, tokenEndpoint: String, useExistingClientSecret: Bool? = nil, userInfoEndpoint: String) {
            self.authenticationRequestExtraParams = authenticationRequestExtraParams
            self.authorizationEndpoint = authorizationEndpoint
            self.clientId = clientId
            self.clientSecret = clientSecret
            self.issuer = issuer
            self.onUnauthenticatedRequest = onUnauthenticatedRequest
            self.scope = scope
            self.sessionCookieName = sessionCookieName
            self.sessionTimeout = sessionTimeout
            self.tokenEndpoint = tokenEndpoint
            self.useExistingClientSecret = useExistingClientSecret
            self.userInfoEndpoint = userInfoEndpoint
        }

        private enum CodingKeys: String, CodingKey {
            case authenticationRequestExtraParams = "AuthenticationRequestExtraParams"
            case authorizationEndpoint = "AuthorizationEndpoint"
            case clientId = "ClientId"
            case clientSecret = "ClientSecret"
            case issuer = "Issuer"
            case onUnauthenticatedRequest = "OnUnauthenticatedRequest"
            case scope = "Scope"
            case sessionCookieName = "SessionCookieName"
            case sessionTimeout = "SessionTimeout"
            case tokenEndpoint = "TokenEndpoint"
            case useExistingClientSecret = "UseExistingClientSecret"
            case userInfoEndpoint = "UserInfoEndpoint"
        }
    }

    public struct AvailabilityZone: AWSDecodableShape {
        /// [Network Load Balancers] If you need static IP addresses for your load balancer, you can specify one Elastic IP address per Availability Zone when you create an internal-facing load balancer. For internal load balancers, you can specify a private IP address from the IPv4 range of the subnet.
        @OptionalCustomCoding<StandardArrayCoder>
        public var loadBalancerAddresses: [LoadBalancerAddress]?
        /// [Application Load Balancers on Outposts] The ID of the Outpost.
        public let outpostId: String?
        /// The ID of the subnet. You can specify one subnet per Availability Zone.
        public let subnetId: String?
        /// The name of the Availability Zone.
        public let zoneName: String?

        public init(loadBalancerAddresses: [LoadBalancerAddress]? = nil, outpostId: String? = nil, subnetId: String? = nil, zoneName: String? = nil) {
            self.loadBalancerAddresses = loadBalancerAddresses
            self.outpostId = outpostId
            self.subnetId = subnetId
            self.zoneName = zoneName
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerAddresses = "LoadBalancerAddresses"
            case outpostId = "OutpostId"
            case subnetId = "SubnetId"
            case zoneName = "ZoneName"
        }
    }

    public struct Certificate: AWSEncodableShape & AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the certificate.
        public let certificateArn: String?
        /// Indicates whether the certificate is the default certificate. Do not set this value when specifying a certificate as an input. This value is not included in the output when describing a listener, but is included when describing listener certificates.
        public let isDefault: Bool?

        public init(certificateArn: String? = nil, isDefault: Bool? = nil) {
            self.certificateArn = certificateArn
            self.isDefault = isDefault
        }

        private enum CodingKeys: String, CodingKey {
            case certificateArn = "CertificateArn"
            case isDefault = "IsDefault"
        }
    }

    public struct Cipher: AWSDecodableShape {
        /// The name of the cipher.
        public let name: String?
        /// The priority of the cipher.
        public let priority: Int?

        public init(name: String? = nil, priority: Int? = nil) {
            self.name = name
            self.priority = priority
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case priority = "Priority"
        }
    }

    public struct CreateListenerInput: AWSEncodableShape {
        /// [TLS listeners] The name of the Application-Layer Protocol Negotiation (ALPN) policy. You can specify one policy name. The following are the possible values:    HTTP1Only     HTTP2Only     HTTP2Optional     HTTP2Preferred     None    For more information, see ALPN policies in the Network Load Balancers Guide.
        @OptionalCustomCoding<StandardArrayCoder>
        public var alpnPolicy: [String]?
        /// [HTTPS and TLS listeners] The default certificate for the listener. You must provide exactly one certificate. Set CertificateArn to the certificate ARN but do not set IsDefault.
        @OptionalCustomCoding<StandardArrayCoder>
        public var certificates: [Certificate]?
        /// The actions for the default rule.
        @CustomCoding<StandardArrayCoder>
        public var defaultActions: [Action]
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String
        /// The port on which the load balancer is listening. You cannot specify a port for a Gateway Load Balancer.
        public let port: Int?
        /// The protocol for connections from clients to the load balancer. For Application Load Balancers, the supported protocols are HTTP and HTTPS. For Network Load Balancers, the supported protocols are TCP, TLS, UDP, and TCP_UDP. You can’t specify the UDP or TCP_UDP protocol if dual-stack mode is enabled. You cannot specify a protocol for a Gateway Load Balancer.
        public let `protocol`: ProtocolEnum?
        /// [HTTPS and TLS listeners] The security policy that defines which protocols and ciphers are supported. For more information, see Security policies in the Application Load Balancers Guide and Security policies in the Network Load Balancers Guide.
        public let sslPolicy: String?
        /// The tags to assign to the listener.
        @OptionalCustomCoding<StandardArrayCoder>
        public var tags: [Tag]?

        public init(alpnPolicy: [String]? = nil, certificates: [Certificate]? = nil, defaultActions: [Action], loadBalancerArn: String, port: Int? = nil, protocol: ProtocolEnum? = nil, sslPolicy: String? = nil, tags: [Tag]? = nil) {
            self.alpnPolicy = alpnPolicy
            self.certificates = certificates
            self.defaultActions = defaultActions
            self.loadBalancerArn = loadBalancerArn
            self.port = port
            self.`protocol` = `protocol`
            self.sslPolicy = sslPolicy
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.defaultActions.forEach {
                try $0.validate(name: "\(name).defaultActions[]")
            }
            try self.validate(self.port, name: "port", parent: name, max: 65535)
            try self.validate(self.port, name: "port", parent: name, min: 1)
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case alpnPolicy = "AlpnPolicy"
            case certificates = "Certificates"
            case defaultActions = "DefaultActions"
            case loadBalancerArn = "LoadBalancerArn"
            case port = "Port"
            case `protocol` = "Protocol"
            case sslPolicy = "SslPolicy"
            case tags = "Tags"
        }
    }

    public struct CreateListenerOutput: AWSDecodableShape {
        /// Information about the listener.
        @OptionalCustomCoding<StandardArrayCoder>
        public var listeners: [Listener]?

        public init(listeners: [Listener]? = nil) {
            self.listeners = listeners
        }

        private enum CodingKeys: String, CodingKey {
            case listeners = "Listeners"
        }
    }

    public struct CreateLoadBalancerInput: AWSEncodableShape {
        /// [Application Load Balancers on Outposts] The ID of the customer-owned address pool (CoIP pool).
        public let customerOwnedIpv4Pool: String?
        /// The type of IP addresses used by the subnets for your load balancer. The possible values are ipv4 (for IPv4 addresses) and dualstack (for IPv4 and IPv6 addresses). Internal load balancers must use ipv4.
        public let ipAddressType: IpAddressType?
        /// The name of the load balancer. This name must be unique per region per account, can have a maximum of 32 characters, must contain only alphanumeric characters or hyphens, must not begin or end with a hyphen, and must not begin with "internal-".
        public let name: String
        /// The nodes of an Internet-facing load balancer have public IP addresses. The DNS name of an Internet-facing load balancer is publicly resolvable to the public IP addresses of the nodes. Therefore, Internet-facing load balancers can route requests from clients over the internet. The nodes of an internal load balancer have only private IP addresses. The DNS name of an internal load balancer is publicly resolvable to the private IP addresses of the nodes. Therefore, internal load balancers can route requests only from clients with access to the VPC for the load balancer. The default is an Internet-facing load balancer. You cannot specify a scheme for a Gateway Load Balancer.
        public let scheme: LoadBalancerSchemeEnum?
        /// [Application Load Balancers] The IDs of the security groups for the load balancer.
        @OptionalCustomCoding<StandardArrayCoder>
        public var securityGroups: [String]?
        /// The IDs of the public subnets. You can specify only one subnet per Availability Zone. You must specify either subnets or subnet mappings. [Application Load Balancers] You must specify subnets from at least two Availability Zones. You cannot specify Elastic IP addresses for your subnets. [Application Load Balancers on Outposts] You must specify one Outpost subnet. [Application Load Balancers on Local Zones] You can specify subnets from one or more Local Zones. [Network Load Balancers] You can specify subnets from one or more Availability Zones. You can specify one Elastic IP address per subnet if you need static IP addresses for your internet-facing load balancer. For internal load balancers, you can specify one private IP address per subnet from the IPv4 range of the subnet. For internet-facing load balancer, you can specify one IPv6 address per subnet. [Gateway Load Balancers] You can specify subnets from one or more Availability Zones. You cannot specify Elastic IP addresses for your subnets.
        @OptionalCustomCoding<StandardArrayCoder>
        public var subnetMappings: [SubnetMapping]?
        /// The IDs of the public subnets. You can specify only one subnet per Availability Zone. You must specify either subnets or subnet mappings. [Application Load Balancers] You must specify subnets from at least two Availability Zones. [Application Load Balancers on Outposts] You must specify one Outpost subnet. [Application Load Balancers on Local Zones] You can specify subnets from one or more Local Zones. [Network Load Balancers] You can specify subnets from one or more Availability Zones. [Gateway Load Balancers] You can specify subnets from one or more Availability Zones.
        @OptionalCustomCoding<StandardArrayCoder>
        public var subnets: [String]?
        /// The tags to assign to the load balancer.
        @OptionalCustomCoding<StandardArrayCoder>
        public var tags: [Tag]?
        /// The type of load balancer. The default is application.
        public let type: LoadBalancerTypeEnum?

        public init(customerOwnedIpv4Pool: String? = nil, ipAddressType: IpAddressType? = nil, name: String, scheme: LoadBalancerSchemeEnum? = nil, securityGroups: [String]? = nil, subnetMappings: [SubnetMapping]? = nil, subnets: [String]? = nil, tags: [Tag]? = nil, type: LoadBalancerTypeEnum? = nil) {
            self.customerOwnedIpv4Pool = customerOwnedIpv4Pool
            self.ipAddressType = ipAddressType
            self.name = name
            self.scheme = scheme
            self.securityGroups = securityGroups
            self.subnetMappings = subnetMappings
            self.subnets = subnets
            self.tags = tags
            self.type = type
        }

        public func validate(name: String) throws {
            try self.validate(self.customerOwnedIpv4Pool, name: "customerOwnedIpv4Pool", parent: name, max: 256)
            try self.validate(self.customerOwnedIpv4Pool, name: "customerOwnedIpv4Pool", parent: name, pattern: "^(ipv4pool-coip-)[a-zA-Z0-9]+$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case customerOwnedIpv4Pool = "CustomerOwnedIpv4Pool"
            case ipAddressType = "IpAddressType"
            case name = "Name"
            case scheme = "Scheme"
            case securityGroups = "SecurityGroups"
            case subnetMappings = "SubnetMappings"
            case subnets = "Subnets"
            case tags = "Tags"
            case type = "Type"
        }
    }

    public struct CreateLoadBalancerOutput: AWSDecodableShape {
        /// Information about the load balancer.
        @OptionalCustomCoding<StandardArrayCoder>
        public var loadBalancers: [LoadBalancer]?

        public init(loadBalancers: [LoadBalancer]? = nil) {
            self.loadBalancers = loadBalancers
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancers = "LoadBalancers"
        }
    }

    public struct CreateRuleInput: AWSEncodableShape {
        /// The actions.
        @CustomCoding<StandardArrayCoder>
        public var actions: [Action]
        /// The conditions.
        @CustomCoding<StandardArrayCoder>
        public var conditions: [RuleCondition]
        /// The Amazon Resource Name (ARN) of the listener.
        public let listenerArn: String
        /// The rule priority. A listener can't have multiple rules with the same priority.
        public let priority: Int
        /// The tags to assign to the rule.
        @OptionalCustomCoding<StandardArrayCoder>
        public var tags: [Tag]?

        public init(actions: [Action], conditions: [RuleCondition], listenerArn: String, priority: Int, tags: [Tag]? = nil) {
            self.actions = actions
            self.conditions = conditions
            self.listenerArn = listenerArn
            self.priority = priority
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.actions.forEach {
                try $0.validate(name: "\(name).actions[]")
            }
            try self.conditions.forEach {
                try $0.validate(name: "\(name).conditions[]")
            }
            try self.validate(self.priority, name: "priority", parent: name, max: 50000)
            try self.validate(self.priority, name: "priority", parent: name, min: 1)
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case actions = "Actions"
            case conditions = "Conditions"
            case listenerArn = "ListenerArn"
            case priority = "Priority"
            case tags = "Tags"
        }
    }

    public struct CreateRuleOutput: AWSDecodableShape {
        /// Information about the rule.
        @OptionalCustomCoding<StandardArrayCoder>
        public var rules: [Rule]?

        public init(rules: [Rule]? = nil) {
            self.rules = rules
        }

        private enum CodingKeys: String, CodingKey {
            case rules = "Rules"
        }
    }

    public struct CreateTargetGroupInput: AWSEncodableShape {
        /// Indicates whether health checks are enabled. If the target type is lambda, health checks are disabled by default but can be enabled. If the target type is instance or ip, health checks are always enabled and cannot be disabled.
        public let healthCheckEnabled: Bool?
        /// The approximate amount of time, in seconds, between health checks of an individual target. If the target group protocol is TCP, TLS, UDP, or TCP_UDP, the supported values are 10 and 30 seconds. If the target group protocol is HTTP or HTTPS, the default is 30 seconds. If the target group protocol is GENEVE, the default is 10 seconds. If the target type is lambda, the default is 35 seconds.
        public let healthCheckIntervalSeconds: Int?
        /// [HTTP/HTTPS health checks] The destination for health checks on the targets. [HTTP1 or HTTP2 protocol version] The ping path. The default is /. [GRPC protocol version] The path of a custom health check method with the format /package.service/method. The default is /AWS.ALB/healthcheck.
        public let healthCheckPath: String?
        /// The port the load balancer uses when performing health checks on targets. If the protocol is HTTP, HTTPS, TCP, TLS, UDP, or TCP_UDP, the default is traffic-port, which is the port on which each target receives traffic from the load balancer. If the protocol is GENEVE, the default is port 80.
        public let healthCheckPort: String?
        /// The protocol the load balancer uses when performing health checks on targets. For Application Load Balancers, the default is HTTP. For Network Load Balancers and Gateway Load Balancers, the default is TCP. The TCP protocol is not supported for health checks if the protocol of the target group is HTTP or HTTPS. The GENEVE, TLS, UDP, and TCP_UDP protocols are not supported for health checks.
        public let healthCheckProtocol: ProtocolEnum?
        /// The amount of time, in seconds, during which no response from a target means a failed health check. For target groups with a protocol of HTTP, HTTPS, or GENEVE, the default is 5 seconds. For target groups with a protocol of TCP or TLS, this value must be 6 seconds for HTTP health checks and 10 seconds for TCP and HTTPS health checks. If the target type is lambda, the default is 30 seconds.
        public let healthCheckTimeoutSeconds: Int?
        /// The number of consecutive health checks successes required before considering an unhealthy target healthy. For target groups with a protocol of HTTP or HTTPS, the default is 5. For target groups with a protocol of TCP, TLS, or GENEVE, the default is 3. If the target type is lambda, the default is 5.
        public let healthyThresholdCount: Int?
        /// [HTTP/HTTPS health checks] The HTTP or gRPC codes to use when checking for a successful response from a target.
        public let matcher: Matcher?
        /// The name of the target group. This name must be unique per region per account, can have a maximum of 32 characters, must contain only alphanumeric characters or hyphens, and must not begin or end with a hyphen.
        public let name: String
        /// The port on which the targets receive traffic. This port is used unless you specify a port override when registering the target. If the target is a Lambda function, this parameter does not apply. If the protocol is GENEVE, the supported port is 6081.
        public let port: Int?
        /// The protocol to use for routing traffic to the targets. For Application Load Balancers, the supported protocols are HTTP and HTTPS. For Network Load Balancers, the supported protocols are TCP, TLS, UDP, or TCP_UDP. For Gateway Load Balancers, the supported protocol is GENEVE. A TCP_UDP listener must be associated with a TCP_UDP target group. If the target is a Lambda function, this parameter does not apply.
        public let `protocol`: ProtocolEnum?
        /// [HTTP/HTTPS protocol] The protocol version. Specify GRPC to send requests to targets using gRPC. Specify HTTP2 to send requests to targets using HTTP/2. The default is HTTP1, which sends requests to targets using HTTP/1.1.
        public let protocolVersion: String?
        /// The tags to assign to the target group.
        @OptionalCustomCoding<StandardArrayCoder>
        public var tags: [Tag]?
        /// The type of target that you must specify when registering targets with this target group. You can't specify targets for a target group using more than one target type.    instance - Register targets by instance ID. This is the default value.    ip - Register targets by IP address. You can specify IP addresses from the subnets of the virtual private cloud (VPC) for the target group, the RFC 1918 range (10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16), and the RFC 6598 range (100.64.0.0/10). You can't specify publicly routable IP addresses.    lambda - Register a single Lambda function as a target.
        public let targetType: TargetTypeEnum?
        /// The number of consecutive health check failures required before considering a target unhealthy. If the target group protocol is HTTP or HTTPS, the default is 2. If the target group protocol is TCP or TLS, this value must be the same as the healthy threshold count. If the target group protocol is GENEVE, the default is 3. If the target type is lambda, the default is 2.
        public let unhealthyThresholdCount: Int?
        /// The identifier of the virtual private cloud (VPC). If the target is a Lambda function, this parameter does not apply. Otherwise, this parameter is required.
        public let vpcId: String?

        public init(healthCheckEnabled: Bool? = nil, healthCheckIntervalSeconds: Int? = nil, healthCheckPath: String? = nil, healthCheckPort: String? = nil, healthCheckProtocol: ProtocolEnum? = nil, healthCheckTimeoutSeconds: Int? = nil, healthyThresholdCount: Int? = nil, matcher: Matcher? = nil, name: String, port: Int? = nil, protocol: ProtocolEnum? = nil, protocolVersion: String? = nil, tags: [Tag]? = nil, targetType: TargetTypeEnum? = nil, unhealthyThresholdCount: Int? = nil, vpcId: String? = nil) {
            self.healthCheckEnabled = healthCheckEnabled
            self.healthCheckIntervalSeconds = healthCheckIntervalSeconds
            self.healthCheckPath = healthCheckPath
            self.healthCheckPort = healthCheckPort
            self.healthCheckProtocol = healthCheckProtocol
            self.healthCheckTimeoutSeconds = healthCheckTimeoutSeconds
            self.healthyThresholdCount = healthyThresholdCount
            self.matcher = matcher
            self.name = name
            self.port = port
            self.`protocol` = `protocol`
            self.protocolVersion = protocolVersion
            self.tags = tags
            self.targetType = targetType
            self.unhealthyThresholdCount = unhealthyThresholdCount
            self.vpcId = vpcId
        }

        public func validate(name: String) throws {
            try self.validate(self.healthCheckIntervalSeconds, name: "healthCheckIntervalSeconds", parent: name, max: 300)
            try self.validate(self.healthCheckIntervalSeconds, name: "healthCheckIntervalSeconds", parent: name, min: 5)
            try self.validate(self.healthCheckPath, name: "healthCheckPath", parent: name, max: 1024)
            try self.validate(self.healthCheckPath, name: "healthCheckPath", parent: name, min: 1)
            try self.validate(self.healthCheckTimeoutSeconds, name: "healthCheckTimeoutSeconds", parent: name, max: 120)
            try self.validate(self.healthCheckTimeoutSeconds, name: "healthCheckTimeoutSeconds", parent: name, min: 2)
            try self.validate(self.healthyThresholdCount, name: "healthyThresholdCount", parent: name, max: 10)
            try self.validate(self.healthyThresholdCount, name: "healthyThresholdCount", parent: name, min: 2)
            try self.validate(self.port, name: "port", parent: name, max: 65535)
            try self.validate(self.port, name: "port", parent: name, min: 1)
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, min: 1)
            try self.validate(self.unhealthyThresholdCount, name: "unhealthyThresholdCount", parent: name, max: 10)
            try self.validate(self.unhealthyThresholdCount, name: "unhealthyThresholdCount", parent: name, min: 2)
        }

        private enum CodingKeys: String, CodingKey {
            case healthCheckEnabled = "HealthCheckEnabled"
            case healthCheckIntervalSeconds = "HealthCheckIntervalSeconds"
            case healthCheckPath = "HealthCheckPath"
            case healthCheckPort = "HealthCheckPort"
            case healthCheckProtocol = "HealthCheckProtocol"
            case healthCheckTimeoutSeconds = "HealthCheckTimeoutSeconds"
            case healthyThresholdCount = "HealthyThresholdCount"
            case matcher = "Matcher"
            case name = "Name"
            case port = "Port"
            case `protocol` = "Protocol"
            case protocolVersion = "ProtocolVersion"
            case tags = "Tags"
            case targetType = "TargetType"
            case unhealthyThresholdCount = "UnhealthyThresholdCount"
            case vpcId = "VpcId"
        }
    }

    public struct CreateTargetGroupOutput: AWSDecodableShape {
        /// Information about the target group.
        @OptionalCustomCoding<StandardArrayCoder>
        public var targetGroups: [TargetGroup]?

        public init(targetGroups: [TargetGroup]? = nil) {
            self.targetGroups = targetGroups
        }

        private enum CodingKeys: String, CodingKey {
            case targetGroups = "TargetGroups"
        }
    }

    public struct DeleteListenerInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the listener.
        public let listenerArn: String

        public init(listenerArn: String) {
            self.listenerArn = listenerArn
        }

        private enum CodingKeys: String, CodingKey {
            case listenerArn = "ListenerArn"
        }
    }

    public struct DeleteListenerOutput: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteLoadBalancerInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String

        public init(loadBalancerArn: String) {
            self.loadBalancerArn = loadBalancerArn
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerArn = "LoadBalancerArn"
        }
    }

    public struct DeleteLoadBalancerOutput: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteRuleInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the rule.
        public let ruleArn: String

        public init(ruleArn: String) {
            self.ruleArn = ruleArn
        }

        private enum CodingKeys: String, CodingKey {
            case ruleArn = "RuleArn"
        }
    }

    public struct DeleteRuleOutput: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteTargetGroupInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the target group.
        public let targetGroupArn: String

        public init(targetGroupArn: String) {
            self.targetGroupArn = targetGroupArn
        }

        private enum CodingKeys: String, CodingKey {
            case targetGroupArn = "TargetGroupArn"
        }
    }

    public struct DeleteTargetGroupOutput: AWSDecodableShape {
        public init() {}
    }

    public struct DeregisterTargetsInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the target group.
        public let targetGroupArn: String
        /// The targets. If you specified a port override when you registered a target, you must specify both the target ID and the port when you deregister it.
        @CustomCoding<StandardArrayCoder>
        public var targets: [TargetDescription]

        public init(targetGroupArn: String, targets: [TargetDescription]) {
            self.targetGroupArn = targetGroupArn
            self.targets = targets
        }

        public func validate(name: String) throws {
            try self.targets.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case targetGroupArn = "TargetGroupArn"
            case targets = "Targets"
        }
    }

    public struct DeregisterTargetsOutput: AWSDecodableShape {
        public init() {}
    }

    public struct DescribeAccountLimitsInput: AWSEncodableShape {
        /// The marker for the next set of results. (You received this marker from a previous call.)
        public let marker: String?
        /// The maximum number of results to return with this call.
        public let pageSize: Int?

        public init(marker: String? = nil, pageSize: Int? = nil) {
            self.marker = marker
            self.pageSize = pageSize
        }

        public func validate(name: String) throws {
            try self.validate(self.pageSize, name: "pageSize", parent: name, max: 400)
            try self.validate(self.pageSize, name: "pageSize", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case marker = "Marker"
            case pageSize = "PageSize"
        }
    }

    public struct DescribeAccountLimitsOutput: AWSDecodableShape {
        /// Information about the limits.
        @OptionalCustomCoding<StandardArrayCoder>
        public var limits: [Limit]?
        /// If there are additional results, this is the marker for the next set of results. Otherwise, this is null.
        public let nextMarker: String?

        public init(limits: [Limit]? = nil, nextMarker: String? = nil) {
            self.limits = limits
            self.nextMarker = nextMarker
        }

        private enum CodingKeys: String, CodingKey {
            case limits = "Limits"
            case nextMarker = "NextMarker"
        }
    }

    public struct DescribeListenerCertificatesInput: AWSEncodableShape {
        /// The Amazon Resource Names (ARN) of the listener.
        public let listenerArn: String
        /// The marker for the next set of results. (You received this marker from a previous call.)
        public let marker: String?
        /// The maximum number of results to return with this call.
        public let pageSize: Int?

        public init(listenerArn: String, marker: String? = nil, pageSize: Int? = nil) {
            self.listenerArn = listenerArn
            self.marker = marker
            self.pageSize = pageSize
        }

        public func validate(name: String) throws {
            try self.validate(self.pageSize, name: "pageSize", parent: name, max: 400)
            try self.validate(self.pageSize, name: "pageSize", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case listenerArn = "ListenerArn"
            case marker = "Marker"
            case pageSize = "PageSize"
        }
    }

    public struct DescribeListenerCertificatesOutput: AWSDecodableShape {
        /// Information about the certificates.
        @OptionalCustomCoding<StandardArrayCoder>
        public var certificates: [Certificate]?
        /// If there are additional results, this is the marker for the next set of results. Otherwise, this is null.
        public let nextMarker: String?

        public init(certificates: [Certificate]? = nil, nextMarker: String? = nil) {
            self.certificates = certificates
            self.nextMarker = nextMarker
        }

        private enum CodingKeys: String, CodingKey {
            case certificates = "Certificates"
            case nextMarker = "NextMarker"
        }
    }

    public struct DescribeListenersInput: AWSEncodableShape {
        /// The Amazon Resource Names (ARN) of the listeners.
        @OptionalCustomCoding<StandardArrayCoder>
        public var listenerArns: [String]?
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String?
        /// The marker for the next set of results. (You received this marker from a previous call.)
        public let marker: String?
        /// The maximum number of results to return with this call.
        public let pageSize: Int?

        public init(listenerArns: [String]? = nil, loadBalancerArn: String? = nil, marker: String? = nil, pageSize: Int? = nil) {
            self.listenerArns = listenerArns
            self.loadBalancerArn = loadBalancerArn
            self.marker = marker
            self.pageSize = pageSize
        }

        public func validate(name: String) throws {
            try self.validate(self.pageSize, name: "pageSize", parent: name, max: 400)
            try self.validate(self.pageSize, name: "pageSize", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case listenerArns = "ListenerArns"
            case loadBalancerArn = "LoadBalancerArn"
            case marker = "Marker"
            case pageSize = "PageSize"
        }
    }

    public struct DescribeListenersOutput: AWSDecodableShape {
        /// Information about the listeners.
        @OptionalCustomCoding<StandardArrayCoder>
        public var listeners: [Listener]?
        /// If there are additional results, this is the marker for the next set of results. Otherwise, this is null.
        public let nextMarker: String?

        public init(listeners: [Listener]? = nil, nextMarker: String? = nil) {
            self.listeners = listeners
            self.nextMarker = nextMarker
        }

        private enum CodingKeys: String, CodingKey {
            case listeners = "Listeners"
            case nextMarker = "NextMarker"
        }
    }

    public struct DescribeLoadBalancerAttributesInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String

        public init(loadBalancerArn: String) {
            self.loadBalancerArn = loadBalancerArn
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerArn = "LoadBalancerArn"
        }
    }

    public struct DescribeLoadBalancerAttributesOutput: AWSDecodableShape {
        /// Information about the load balancer attributes.
        @OptionalCustomCoding<StandardArrayCoder>
        public var attributes: [LoadBalancerAttribute]?

        public init(attributes: [LoadBalancerAttribute]? = nil) {
            self.attributes = attributes
        }

        private enum CodingKeys: String, CodingKey {
            case attributes = "Attributes"
        }
    }

    public struct DescribeLoadBalancersInput: AWSEncodableShape {
        /// The Amazon Resource Names (ARN) of the load balancers. You can specify up to 20 load balancers in a single call.
        @OptionalCustomCoding<StandardArrayCoder>
        public var loadBalancerArns: [String]?
        /// The marker for the next set of results. (You received this marker from a previous call.)
        public let marker: String?
        /// The names of the load balancers.
        @OptionalCustomCoding<StandardArrayCoder>
        public var names: [String]?
        /// The maximum number of results to return with this call.
        public let pageSize: Int?

        public init(loadBalancerArns: [String]? = nil, marker: String? = nil, names: [String]? = nil, pageSize: Int? = nil) {
            self.loadBalancerArns = loadBalancerArns
            self.marker = marker
            self.names = names
            self.pageSize = pageSize
        }

        public func validate(name: String) throws {
            try self.validate(self.pageSize, name: "pageSize", parent: name, max: 400)
            try self.validate(self.pageSize, name: "pageSize", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerArns = "LoadBalancerArns"
            case marker = "Marker"
            case names = "Names"
            case pageSize = "PageSize"
        }
    }

    public struct DescribeLoadBalancersOutput: AWSDecodableShape {
        /// Information about the load balancers.
        @OptionalCustomCoding<StandardArrayCoder>
        public var loadBalancers: [LoadBalancer]?
        /// If there are additional results, this is the marker for the next set of results. Otherwise, this is null.
        public let nextMarker: String?

        public init(loadBalancers: [LoadBalancer]? = nil, nextMarker: String? = nil) {
            self.loadBalancers = loadBalancers
            self.nextMarker = nextMarker
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancers = "LoadBalancers"
            case nextMarker = "NextMarker"
        }
    }

    public struct DescribeRulesInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the listener.
        public let listenerArn: String?
        /// The marker for the next set of results. (You received this marker from a previous call.)
        public let marker: String?
        /// The maximum number of results to return with this call.
        public let pageSize: Int?
        /// The Amazon Resource Names (ARN) of the rules.
        @OptionalCustomCoding<StandardArrayCoder>
        public var ruleArns: [String]?

        public init(listenerArn: String? = nil, marker: String? = nil, pageSize: Int? = nil, ruleArns: [String]? = nil) {
            self.listenerArn = listenerArn
            self.marker = marker
            self.pageSize = pageSize
            self.ruleArns = ruleArns
        }

        public func validate(name: String) throws {
            try self.validate(self.pageSize, name: "pageSize", parent: name, max: 400)
            try self.validate(self.pageSize, name: "pageSize", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case listenerArn = "ListenerArn"
            case marker = "Marker"
            case pageSize = "PageSize"
            case ruleArns = "RuleArns"
        }
    }

    public struct DescribeRulesOutput: AWSDecodableShape {
        /// If there are additional results, this is the marker for the next set of results. Otherwise, this is null.
        public let nextMarker: String?
        /// Information about the rules.
        @OptionalCustomCoding<StandardArrayCoder>
        public var rules: [Rule]?

        public init(nextMarker: String? = nil, rules: [Rule]? = nil) {
            self.nextMarker = nextMarker
            self.rules = rules
        }

        private enum CodingKeys: String, CodingKey {
            case nextMarker = "NextMarker"
            case rules = "Rules"
        }
    }

    public struct DescribeSSLPoliciesInput: AWSEncodableShape {
        /// The marker for the next set of results. (You received this marker from a previous call.)
        public let marker: String?
        /// The names of the policies.
        @OptionalCustomCoding<StandardArrayCoder>
        public var names: [String]?
        /// The maximum number of results to return with this call.
        public let pageSize: Int?

        public init(marker: String? = nil, names: [String]? = nil, pageSize: Int? = nil) {
            self.marker = marker
            self.names = names
            self.pageSize = pageSize
        }

        public func validate(name: String) throws {
            try self.validate(self.pageSize, name: "pageSize", parent: name, max: 400)
            try self.validate(self.pageSize, name: "pageSize", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case marker = "Marker"
            case names = "Names"
            case pageSize = "PageSize"
        }
    }

    public struct DescribeSSLPoliciesOutput: AWSDecodableShape {
        /// If there are additional results, this is the marker for the next set of results. Otherwise, this is null.
        public let nextMarker: String?
        /// Information about the security policies.
        @OptionalCustomCoding<StandardArrayCoder>
        public var sslPolicies: [SslPolicy]?

        public init(nextMarker: String? = nil, sslPolicies: [SslPolicy]? = nil) {
            self.nextMarker = nextMarker
            self.sslPolicies = sslPolicies
        }

        private enum CodingKeys: String, CodingKey {
            case nextMarker = "NextMarker"
            case sslPolicies = "SslPolicies"
        }
    }

    public struct DescribeTagsInput: AWSEncodableShape {
        /// The Amazon Resource Names (ARN) of the resources. You can specify up to 20 resources in a single call.
        @CustomCoding<StandardArrayCoder>
        public var resourceArns: [String]

        public init(resourceArns: [String]) {
            self.resourceArns = resourceArns
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArns = "ResourceArns"
        }
    }

    public struct DescribeTagsOutput: AWSDecodableShape {
        /// Information about the tags.
        @OptionalCustomCoding<StandardArrayCoder>
        public var tagDescriptions: [TagDescription]?

        public init(tagDescriptions: [TagDescription]? = nil) {
            self.tagDescriptions = tagDescriptions
        }

        private enum CodingKeys: String, CodingKey {
            case tagDescriptions = "TagDescriptions"
        }
    }

    public struct DescribeTargetGroupAttributesInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the target group.
        public let targetGroupArn: String

        public init(targetGroupArn: String) {
            self.targetGroupArn = targetGroupArn
        }

        private enum CodingKeys: String, CodingKey {
            case targetGroupArn = "TargetGroupArn"
        }
    }

    public struct DescribeTargetGroupAttributesOutput: AWSDecodableShape {
        /// Information about the target group attributes
        @OptionalCustomCoding<StandardArrayCoder>
        public var attributes: [TargetGroupAttribute]?

        public init(attributes: [TargetGroupAttribute]? = nil) {
            self.attributes = attributes
        }

        private enum CodingKeys: String, CodingKey {
            case attributes = "Attributes"
        }
    }

    public struct DescribeTargetGroupsInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String?
        /// The marker for the next set of results. (You received this marker from a previous call.)
        public let marker: String?
        /// The names of the target groups.
        @OptionalCustomCoding<StandardArrayCoder>
        public var names: [String]?
        /// The maximum number of results to return with this call.
        public let pageSize: Int?
        /// The Amazon Resource Names (ARN) of the target groups.
        @OptionalCustomCoding<StandardArrayCoder>
        public var targetGroupArns: [String]?

        public init(loadBalancerArn: String? = nil, marker: String? = nil, names: [String]? = nil, pageSize: Int? = nil, targetGroupArns: [String]? = nil) {
            self.loadBalancerArn = loadBalancerArn
            self.marker = marker
            self.names = names
            self.pageSize = pageSize
            self.targetGroupArns = targetGroupArns
        }

        public func validate(name: String) throws {
            try self.validate(self.pageSize, name: "pageSize", parent: name, max: 400)
            try self.validate(self.pageSize, name: "pageSize", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerArn = "LoadBalancerArn"
            case marker = "Marker"
            case names = "Names"
            case pageSize = "PageSize"
            case targetGroupArns = "TargetGroupArns"
        }
    }

    public struct DescribeTargetGroupsOutput: AWSDecodableShape {
        /// If there are additional results, this is the marker for the next set of results. Otherwise, this is null.
        public let nextMarker: String?
        /// Information about the target groups.
        @OptionalCustomCoding<StandardArrayCoder>
        public var targetGroups: [TargetGroup]?

        public init(nextMarker: String? = nil, targetGroups: [TargetGroup]? = nil) {
            self.nextMarker = nextMarker
            self.targetGroups = targetGroups
        }

        private enum CodingKeys: String, CodingKey {
            case nextMarker = "NextMarker"
            case targetGroups = "TargetGroups"
        }
    }

    public struct DescribeTargetHealthInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the target group.
        public let targetGroupArn: String
        /// The targets.
        @OptionalCustomCoding<StandardArrayCoder>
        public var targets: [TargetDescription]?

        public init(targetGroupArn: String, targets: [TargetDescription]? = nil) {
            self.targetGroupArn = targetGroupArn
            self.targets = targets
        }

        public func validate(name: String) throws {
            try self.targets?.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case targetGroupArn = "TargetGroupArn"
            case targets = "Targets"
        }
    }

    public struct DescribeTargetHealthOutput: AWSDecodableShape {
        /// Information about the health of the targets.
        @OptionalCustomCoding<StandardArrayCoder>
        public var targetHealthDescriptions: [TargetHealthDescription]?

        public init(targetHealthDescriptions: [TargetHealthDescription]? = nil) {
            self.targetHealthDescriptions = targetHealthDescriptions
        }

        private enum CodingKeys: String, CodingKey {
            case targetHealthDescriptions = "TargetHealthDescriptions"
        }
    }

    public struct FixedResponseActionConfig: AWSEncodableShape & AWSDecodableShape {
        /// The content type. Valid Values: text/plain | text/css | text/html | application/javascript | application/json
        public let contentType: String?
        /// The message.
        public let messageBody: String?
        /// The HTTP response code (2XX, 4XX, or 5XX).
        public let statusCode: String

        public init(contentType: String? = nil, messageBody: String? = nil, statusCode: String) {
            self.contentType = contentType
            self.messageBody = messageBody
            self.statusCode = statusCode
        }

        public func validate(name: String) throws {
            try self.validate(self.contentType, name: "contentType", parent: name, max: 32)
            try self.validate(self.contentType, name: "contentType", parent: name, min: 0)
            try self.validate(self.messageBody, name: "messageBody", parent: name, max: 1024)
            try self.validate(self.messageBody, name: "messageBody", parent: name, min: 0)
            try self.validate(self.statusCode, name: "statusCode", parent: name, pattern: "^(2|4|5)\\d\\d$")
        }

        private enum CodingKeys: String, CodingKey {
            case contentType = "ContentType"
            case messageBody = "MessageBody"
            case statusCode = "StatusCode"
        }
    }

    public struct ForwardActionConfig: AWSEncodableShape & AWSDecodableShape {
        /// One or more target groups. For Network Load Balancers, you can specify a single target group.
        @OptionalCustomCoding<StandardArrayCoder>
        public var targetGroups: [TargetGroupTuple]?
        /// The target group stickiness for the rule.
        public let targetGroupStickinessConfig: TargetGroupStickinessConfig?

        public init(targetGroups: [TargetGroupTuple]? = nil, targetGroupStickinessConfig: TargetGroupStickinessConfig? = nil) {
            self.targetGroups = targetGroups
            self.targetGroupStickinessConfig = targetGroupStickinessConfig
        }

        private enum CodingKeys: String, CodingKey {
            case targetGroups = "TargetGroups"
            case targetGroupStickinessConfig = "TargetGroupStickinessConfig"
        }
    }

    public struct HostHeaderConditionConfig: AWSEncodableShape & AWSDecodableShape {
        /// One or more host names. The maximum size of each name is 128 characters. The comparison is case insensitive. The following wildcard characters are supported: * (matches 0 or more characters) and ? (matches exactly 1 character). If you specify multiple strings, the condition is satisfied if one of the strings matches the host name.
        @OptionalCustomCoding<StandardArrayCoder>
        public var values: [String]?

        public init(values: [String]? = nil) {
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case values = "Values"
        }
    }

    public struct HttpHeaderConditionConfig: AWSEncodableShape & AWSDecodableShape {
        /// The name of the HTTP header field. The maximum size is 40 characters. The header name is case insensitive. The allowed characters are specified by RFC 7230. Wildcards are not supported. You can't use an HTTP header condition to specify the host header. Use HostHeaderConditionConfig to specify a host header condition.
        public let httpHeaderName: String?
        /// One or more strings to compare against the value of the HTTP header. The maximum size of each string is 128 characters. The comparison strings are case insensitive. The following wildcard characters are supported: * (matches 0 or more characters) and ? (matches exactly 1 character). If the same header appears multiple times in the request, we search them in order until a match is found. If you specify multiple strings, the condition is satisfied if one of the strings matches the value of the HTTP header. To require that all of the strings are a match, create one condition per string.
        @OptionalCustomCoding<StandardArrayCoder>
        public var values: [String]?

        public init(httpHeaderName: String? = nil, values: [String]? = nil) {
            self.httpHeaderName = httpHeaderName
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case httpHeaderName = "HttpHeaderName"
            case values = "Values"
        }
    }

    public struct HttpRequestMethodConditionConfig: AWSEncodableShape & AWSDecodableShape {
        /// The name of the request method. The maximum size is 40 characters. The allowed characters are A-Z, hyphen (-), and underscore (_). The comparison is case sensitive. Wildcards are not supported; therefore, the method name must be an exact match. If you specify multiple strings, the condition is satisfied if one of the strings matches the HTTP request method. We recommend that you route GET and HEAD requests in the same way, because the response to a HEAD request may be cached.
        @OptionalCustomCoding<StandardArrayCoder>
        public var values: [String]?

        public init(values: [String]? = nil) {
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case values = "Values"
        }
    }

    public struct Limit: AWSDecodableShape {
        /// The maximum value of the limit.
        public let max: String?
        /// The name of the limit. The possible values are:   application-load-balancers   condition-values-per-alb-rule   condition-wildcards-per-alb-rule   gateway-load-balancers   gateway-load-balancers-per-vpc   geneve-target-groups   listeners-per-application-load-balancer   listeners-per-network-load-balancer   network-load-balancers   rules-per-application-load-balancer   target-groups   target-groups-per-action-on-application-load-balancer   target-groups-per-action-on-network-load-balancer   target-groups-per-application-load-balancer   targets-per-application-load-balancer   targets-per-availability-zone-per-gateway-load-balancer   targets-per-availability-zone-per-network-load-balancer   targets-per-network-load-balancer
        public let name: String?

        public init(max: String? = nil, name: String? = nil) {
            self.max = max
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case max = "Max"
            case name = "Name"
        }
    }

    public struct Listener: AWSDecodableShape {
        /// [TLS listener] The name of the Application-Layer Protocol Negotiation (ALPN) policy.
        @OptionalCustomCoding<StandardArrayCoder>
        public var alpnPolicy: [String]?
        /// [HTTPS or TLS listener] The default certificate for the listener.
        @OptionalCustomCoding<StandardArrayCoder>
        public var certificates: [Certificate]?
        /// The default actions for the listener.
        @OptionalCustomCoding<StandardArrayCoder>
        public var defaultActions: [Action]?
        /// The Amazon Resource Name (ARN) of the listener.
        public let listenerArn: String?
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String?
        /// The port on which the load balancer is listening.
        public let port: Int?
        /// The protocol for connections from clients to the load balancer.
        public let `protocol`: ProtocolEnum?
        /// [HTTPS or TLS listener] The security policy that defines which protocols and ciphers are supported.
        public let sslPolicy: String?

        public init(alpnPolicy: [String]? = nil, certificates: [Certificate]? = nil, defaultActions: [Action]? = nil, listenerArn: String? = nil, loadBalancerArn: String? = nil, port: Int? = nil, protocol: ProtocolEnum? = nil, sslPolicy: String? = nil) {
            self.alpnPolicy = alpnPolicy
            self.certificates = certificates
            self.defaultActions = defaultActions
            self.listenerArn = listenerArn
            self.loadBalancerArn = loadBalancerArn
            self.port = port
            self.`protocol` = `protocol`
            self.sslPolicy = sslPolicy
        }

        private enum CodingKeys: String, CodingKey {
            case alpnPolicy = "AlpnPolicy"
            case certificates = "Certificates"
            case defaultActions = "DefaultActions"
            case listenerArn = "ListenerArn"
            case loadBalancerArn = "LoadBalancerArn"
            case port = "Port"
            case `protocol` = "Protocol"
            case sslPolicy = "SslPolicy"
        }
    }

    public struct LoadBalancer: AWSDecodableShape {
        /// The subnets for the load balancer.
        @OptionalCustomCoding<StandardArrayCoder>
        public var availabilityZones: [AvailabilityZone]?
        /// The ID of the Amazon Route 53 hosted zone associated with the load balancer.
        public let canonicalHostedZoneId: String?
        /// The date and time the load balancer was created.
        public let createdTime: Date?
        /// [Application Load Balancers on Outposts] The ID of the customer-owned address pool.
        public let customerOwnedIpv4Pool: String?
        /// The public DNS name of the load balancer.
        public let dNSName: String?
        /// The type of IP addresses used by the subnets for your load balancer. The possible values are ipv4 (for IPv4 addresses) and dualstack (for IPv4 and IPv6 addresses).
        public let ipAddressType: IpAddressType?
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String?
        /// The name of the load balancer.
        public let loadBalancerName: String?
        /// The nodes of an Internet-facing load balancer have public IP addresses. The DNS name of an Internet-facing load balancer is publicly resolvable to the public IP addresses of the nodes. Therefore, Internet-facing load balancers can route requests from clients over the internet. The nodes of an internal load balancer have only private IP addresses. The DNS name of an internal load balancer is publicly resolvable to the private IP addresses of the nodes. Therefore, internal load balancers can route requests only from clients with access to the VPC for the load balancer.
        public let scheme: LoadBalancerSchemeEnum?
        /// The IDs of the security groups for the load balancer.
        @OptionalCustomCoding<StandardArrayCoder>
        public var securityGroups: [String]?
        /// The state of the load balancer.
        public let state: LoadBalancerState?
        /// The type of load balancer.
        public let type: LoadBalancerTypeEnum?
        /// The ID of the VPC for the load balancer.
        public let vpcId: String?

        public init(availabilityZones: [AvailabilityZone]? = nil, canonicalHostedZoneId: String? = nil, createdTime: Date? = nil, customerOwnedIpv4Pool: String? = nil, dNSName: String? = nil, ipAddressType: IpAddressType? = nil, loadBalancerArn: String? = nil, loadBalancerName: String? = nil, scheme: LoadBalancerSchemeEnum? = nil, securityGroups: [String]? = nil, state: LoadBalancerState? = nil, type: LoadBalancerTypeEnum? = nil, vpcId: String? = nil) {
            self.availabilityZones = availabilityZones
            self.canonicalHostedZoneId = canonicalHostedZoneId
            self.createdTime = createdTime
            self.customerOwnedIpv4Pool = customerOwnedIpv4Pool
            self.dNSName = dNSName
            self.ipAddressType = ipAddressType
            self.loadBalancerArn = loadBalancerArn
            self.loadBalancerName = loadBalancerName
            self.scheme = scheme
            self.securityGroups = securityGroups
            self.state = state
            self.type = type
            self.vpcId = vpcId
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZones = "AvailabilityZones"
            case canonicalHostedZoneId = "CanonicalHostedZoneId"
            case createdTime = "CreatedTime"
            case customerOwnedIpv4Pool = "CustomerOwnedIpv4Pool"
            case dNSName = "DNSName"
            case ipAddressType = "IpAddressType"
            case loadBalancerArn = "LoadBalancerArn"
            case loadBalancerName = "LoadBalancerName"
            case scheme = "Scheme"
            case securityGroups = "SecurityGroups"
            case state = "State"
            case type = "Type"
            case vpcId = "VpcId"
        }
    }

    public struct LoadBalancerAddress: AWSDecodableShape {
        /// [Network Load Balancers] The allocation ID of the Elastic IP address for an internal-facing load balancer.
        public let allocationId: String?
        /// The static IP address.
        public let ipAddress: String?
        /// [Network Load Balancers] The IPv6 address.
        public let iPv6Address: String?
        /// [Network Load Balancers] The private IPv4 address for an internal load balancer.
        public let privateIPv4Address: String?

        public init(allocationId: String? = nil, ipAddress: String? = nil, iPv6Address: String? = nil, privateIPv4Address: String? = nil) {
            self.allocationId = allocationId
            self.ipAddress = ipAddress
            self.iPv6Address = iPv6Address
            self.privateIPv4Address = privateIPv4Address
        }

        private enum CodingKeys: String, CodingKey {
            case allocationId = "AllocationId"
            case ipAddress = "IpAddress"
            case iPv6Address = "IPv6Address"
            case privateIPv4Address = "PrivateIPv4Address"
        }
    }

    public struct LoadBalancerAttribute: AWSEncodableShape & AWSDecodableShape {
        /// The name of the attribute. The following attribute is supported by all load balancers:    deletion_protection.enabled - Indicates whether deletion protection is enabled. The value is true or false. The default is false.   The following attributes are supported by both Application Load Balancers and Network Load Balancers:    access_logs.s3.enabled - Indicates whether access logs are enabled. The value is true or false. The default is false.    access_logs.s3.bucket - The name of the S3 bucket for the access logs. This attribute is required if access logs are enabled. The bucket must exist in the same region as the load balancer and have a bucket policy that grants Elastic Load Balancing permissions to write to the bucket.    access_logs.s3.prefix - The prefix for the location in the S3 bucket for the access logs.   The following attributes are supported by only Application Load Balancers:    idle_timeout.timeout_seconds - The idle timeout value, in seconds. The valid range is 1-4000 seconds. The default is 60 seconds.    routing.http.desync_mitigation_mode - Determines how the load balancer handles requests that might pose a security risk to your application. The possible values are monitor, defensive, and strictest. The default is defensive.    routing.http.drop_invalid_header_fields.enabled - Indicates whether HTTP headers with invalid header fields are removed by the load balancer (true) or routed to targets (false). The default is false.    routing.http2.enabled - Indicates whether HTTP/2 is enabled. The value is true or false. The default is true. Elastic Load Balancing requires that message header names contain only alphanumeric characters and hyphens.    waf.fail_open.enabled - Indicates whether to allow a WAF-enabled load balancer to route requests to targets if it is unable to forward the request to AWS WAF. The value is true or false. The default is false.   The following attribute is supported by Network Load Balancers and Gateway Load Balancers:    load_balancing.cross_zone.enabled - Indicates whether cross-zone load balancing is enabled. The value is true or false. The default is false.
        public let key: String?
        /// The value of the attribute.
        public let value: String?

        public init(key: String? = nil, value: String? = nil) {
            self.key = key
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 256)
            try self.validate(self.key, name: "key", parent: name, pattern: "^[a-zA-Z0-9._]+$")
            try self.validate(self.value, name: "value", parent: name, max: 1024)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case value = "Value"
        }
    }

    public struct LoadBalancerState: AWSDecodableShape {
        /// The state code. The initial state of the load balancer is provisioning. After the load balancer is fully set up and ready to route traffic, its state is active. If load balancer is routing traffic but does not have the resources it needs to scale, its state isactive_impaired. If the load balancer could not be set up, its state is failed.
        public let code: LoadBalancerStateEnum?
        /// A description of the state.
        public let reason: String?

        public init(code: LoadBalancerStateEnum? = nil, reason: String? = nil) {
            self.code = code
            self.reason = reason
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case reason = "Reason"
        }
    }

    public struct Matcher: AWSEncodableShape & AWSDecodableShape {
        /// You can specify values between 0 and 99. You can specify multiple values (for example, "0,1") or a range of values (for example, "0-5"). The default value is 12.
        public let grpcCode: String?
        /// For Application Load Balancers, you can specify values between 200 and 499, and the default value is 200. You can specify multiple values (for example, "200,202") or a range of values (for example, "200-299"). For Network Load Balancers and Gateway Load Balancers, this must be "200–399".
        public let httpCode: String?

        public init(grpcCode: String? = nil, httpCode: String? = nil) {
            self.grpcCode = grpcCode
            self.httpCode = httpCode
        }

        private enum CodingKeys: String, CodingKey {
            case grpcCode = "GrpcCode"
            case httpCode = "HttpCode"
        }
    }

    public struct ModifyListenerInput: AWSEncodableShape {
        /// [TLS listeners] The name of the Application-Layer Protocol Negotiation (ALPN) policy. You can specify one policy name. The following are the possible values:    HTTP1Only     HTTP2Only     HTTP2Optional     HTTP2Preferred     None    For more information, see ALPN policies in the Network Load Balancers Guide.
        @OptionalCustomCoding<StandardArrayCoder>
        public var alpnPolicy: [String]?
        /// [HTTPS and TLS listeners] The default certificate for the listener. You must provide exactly one certificate. Set CertificateArn to the certificate ARN but do not set IsDefault.
        @OptionalCustomCoding<StandardArrayCoder>
        public var certificates: [Certificate]?
        /// The actions for the default rule.
        @OptionalCustomCoding<StandardArrayCoder>
        public var defaultActions: [Action]?
        /// The Amazon Resource Name (ARN) of the listener.
        public let listenerArn: String
        /// The port for connections from clients to the load balancer. You cannot specify a port for a Gateway Load Balancer.
        public let port: Int?
        /// The protocol for connections from clients to the load balancer. Application Load Balancers support the HTTP and HTTPS protocols. Network Load Balancers support the TCP, TLS, UDP, and TCP_UDP protocols. You can’t change the protocol to UDP or TCP_UDP if dual-stack mode is enabled. You cannot specify a protocol for a Gateway Load Balancer.
        public let `protocol`: ProtocolEnum?
        /// [HTTPS and TLS listeners] The security policy that defines which protocols and ciphers are supported. For more information, see Security policies in the Application Load Balancers Guide or Security policies in the Network Load Balancers Guide.
        public let sslPolicy: String?

        public init(alpnPolicy: [String]? = nil, certificates: [Certificate]? = nil, defaultActions: [Action]? = nil, listenerArn: String, port: Int? = nil, protocol: ProtocolEnum? = nil, sslPolicy: String? = nil) {
            self.alpnPolicy = alpnPolicy
            self.certificates = certificates
            self.defaultActions = defaultActions
            self.listenerArn = listenerArn
            self.port = port
            self.`protocol` = `protocol`
            self.sslPolicy = sslPolicy
        }

        public func validate(name: String) throws {
            try self.defaultActions?.forEach {
                try $0.validate(name: "\(name).defaultActions[]")
            }
            try self.validate(self.port, name: "port", parent: name, max: 65535)
            try self.validate(self.port, name: "port", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case alpnPolicy = "AlpnPolicy"
            case certificates = "Certificates"
            case defaultActions = "DefaultActions"
            case listenerArn = "ListenerArn"
            case port = "Port"
            case `protocol` = "Protocol"
            case sslPolicy = "SslPolicy"
        }
    }

    public struct ModifyListenerOutput: AWSDecodableShape {
        /// Information about the modified listener.
        @OptionalCustomCoding<StandardArrayCoder>
        public var listeners: [Listener]?

        public init(listeners: [Listener]? = nil) {
            self.listeners = listeners
        }

        private enum CodingKeys: String, CodingKey {
            case listeners = "Listeners"
        }
    }

    public struct ModifyLoadBalancerAttributesInput: AWSEncodableShape {
        /// The load balancer attributes.
        @CustomCoding<StandardArrayCoder>
        public var attributes: [LoadBalancerAttribute]
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String

        public init(attributes: [LoadBalancerAttribute], loadBalancerArn: String) {
            self.attributes = attributes
            self.loadBalancerArn = loadBalancerArn
        }

        public func validate(name: String) throws {
            try self.attributes.forEach {
                try $0.validate(name: "\(name).attributes[]")
            }
            try self.validate(self.attributes, name: "attributes", parent: name, max: 20)
        }

        private enum CodingKeys: String, CodingKey {
            case attributes = "Attributes"
            case loadBalancerArn = "LoadBalancerArn"
        }
    }

    public struct ModifyLoadBalancerAttributesOutput: AWSDecodableShape {
        /// Information about the load balancer attributes.
        @OptionalCustomCoding<StandardArrayCoder>
        public var attributes: [LoadBalancerAttribute]?

        public init(attributes: [LoadBalancerAttribute]? = nil) {
            self.attributes = attributes
        }

        private enum CodingKeys: String, CodingKey {
            case attributes = "Attributes"
        }
    }

    public struct ModifyRuleInput: AWSEncodableShape {
        /// The actions.
        @OptionalCustomCoding<StandardArrayCoder>
        public var actions: [Action]?
        /// The conditions.
        @OptionalCustomCoding<StandardArrayCoder>
        public var conditions: [RuleCondition]?
        /// The Amazon Resource Name (ARN) of the rule.
        public let ruleArn: String

        public init(actions: [Action]? = nil, conditions: [RuleCondition]? = nil, ruleArn: String) {
            self.actions = actions
            self.conditions = conditions
            self.ruleArn = ruleArn
        }

        public func validate(name: String) throws {
            try self.actions?.forEach {
                try $0.validate(name: "\(name).actions[]")
            }
            try self.conditions?.forEach {
                try $0.validate(name: "\(name).conditions[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case actions = "Actions"
            case conditions = "Conditions"
            case ruleArn = "RuleArn"
        }
    }

    public struct ModifyRuleOutput: AWSDecodableShape {
        /// Information about the modified rule.
        @OptionalCustomCoding<StandardArrayCoder>
        public var rules: [Rule]?

        public init(rules: [Rule]? = nil) {
            self.rules = rules
        }

        private enum CodingKeys: String, CodingKey {
            case rules = "Rules"
        }
    }

    public struct ModifyTargetGroupAttributesInput: AWSEncodableShape {
        /// The attributes.
        @CustomCoding<StandardArrayCoder>
        public var attributes: [TargetGroupAttribute]
        /// The Amazon Resource Name (ARN) of the target group.
        public let targetGroupArn: String

        public init(attributes: [TargetGroupAttribute], targetGroupArn: String) {
            self.attributes = attributes
            self.targetGroupArn = targetGroupArn
        }

        public func validate(name: String) throws {
            try self.attributes.forEach {
                try $0.validate(name: "\(name).attributes[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case attributes = "Attributes"
            case targetGroupArn = "TargetGroupArn"
        }
    }

    public struct ModifyTargetGroupAttributesOutput: AWSDecodableShape {
        /// Information about the attributes.
        @OptionalCustomCoding<StandardArrayCoder>
        public var attributes: [TargetGroupAttribute]?

        public init(attributes: [TargetGroupAttribute]? = nil) {
            self.attributes = attributes
        }

        private enum CodingKeys: String, CodingKey {
            case attributes = "Attributes"
        }
    }

    public struct ModifyTargetGroupInput: AWSEncodableShape {
        /// Indicates whether health checks are enabled.
        public let healthCheckEnabled: Bool?
        /// The approximate amount of time, in seconds, between health checks of an individual target. For TCP health checks, the supported values are 10 or 30 seconds. With Network Load Balancers, you can't modify this setting.
        public let healthCheckIntervalSeconds: Int?
        /// [HTTP/HTTPS health checks] The destination for health checks on the targets. [HTTP1 or HTTP2 protocol version] The ping path. The default is /. [GRPC protocol version] The path of a custom health check method with the format /package.service/method. The default is /AWS.ALB/healthcheck.
        public let healthCheckPath: String?
        /// The port the load balancer uses when performing health checks on targets.
        public let healthCheckPort: String?
        /// The protocol the load balancer uses when performing health checks on targets. The TCP protocol is supported for health checks only if the protocol of the target group is TCP, TLS, UDP, or TCP_UDP. The GENEVE, TLS, UDP, and TCP_UDP protocols are not supported for health checks. With Network Load Balancers, you can't modify this setting.
        public let healthCheckProtocol: ProtocolEnum?
        /// [HTTP/HTTPS health checks] The amount of time, in seconds, during which no response means a failed health check. With Network Load Balancers, you can't modify this setting.
        public let healthCheckTimeoutSeconds: Int?
        /// The number of consecutive health checks successes required before considering an unhealthy target healthy.
        public let healthyThresholdCount: Int?
        /// [HTTP/HTTPS health checks] The HTTP or gRPC codes to use when checking for a successful response from a target. With Network Load Balancers, you can't modify this setting.
        public let matcher: Matcher?
        /// The Amazon Resource Name (ARN) of the target group.
        public let targetGroupArn: String
        /// The number of consecutive health check failures required before considering the target unhealthy. For target groups with a protocol of TCP or TLS, this value must be the same as the healthy threshold count.
        public let unhealthyThresholdCount: Int?

        public init(healthCheckEnabled: Bool? = nil, healthCheckIntervalSeconds: Int? = nil, healthCheckPath: String? = nil, healthCheckPort: String? = nil, healthCheckProtocol: ProtocolEnum? = nil, healthCheckTimeoutSeconds: Int? = nil, healthyThresholdCount: Int? = nil, matcher: Matcher? = nil, targetGroupArn: String, unhealthyThresholdCount: Int? = nil) {
            self.healthCheckEnabled = healthCheckEnabled
            self.healthCheckIntervalSeconds = healthCheckIntervalSeconds
            self.healthCheckPath = healthCheckPath
            self.healthCheckPort = healthCheckPort
            self.healthCheckProtocol = healthCheckProtocol
            self.healthCheckTimeoutSeconds = healthCheckTimeoutSeconds
            self.healthyThresholdCount = healthyThresholdCount
            self.matcher = matcher
            self.targetGroupArn = targetGroupArn
            self.unhealthyThresholdCount = unhealthyThresholdCount
        }

        public func validate(name: String) throws {
            try self.validate(self.healthCheckIntervalSeconds, name: "healthCheckIntervalSeconds", parent: name, max: 300)
            try self.validate(self.healthCheckIntervalSeconds, name: "healthCheckIntervalSeconds", parent: name, min: 5)
            try self.validate(self.healthCheckPath, name: "healthCheckPath", parent: name, max: 1024)
            try self.validate(self.healthCheckPath, name: "healthCheckPath", parent: name, min: 1)
            try self.validate(self.healthCheckTimeoutSeconds, name: "healthCheckTimeoutSeconds", parent: name, max: 120)
            try self.validate(self.healthCheckTimeoutSeconds, name: "healthCheckTimeoutSeconds", parent: name, min: 2)
            try self.validate(self.healthyThresholdCount, name: "healthyThresholdCount", parent: name, max: 10)
            try self.validate(self.healthyThresholdCount, name: "healthyThresholdCount", parent: name, min: 2)
            try self.validate(self.unhealthyThresholdCount, name: "unhealthyThresholdCount", parent: name, max: 10)
            try self.validate(self.unhealthyThresholdCount, name: "unhealthyThresholdCount", parent: name, min: 2)
        }

        private enum CodingKeys: String, CodingKey {
            case healthCheckEnabled = "HealthCheckEnabled"
            case healthCheckIntervalSeconds = "HealthCheckIntervalSeconds"
            case healthCheckPath = "HealthCheckPath"
            case healthCheckPort = "HealthCheckPort"
            case healthCheckProtocol = "HealthCheckProtocol"
            case healthCheckTimeoutSeconds = "HealthCheckTimeoutSeconds"
            case healthyThresholdCount = "HealthyThresholdCount"
            case matcher = "Matcher"
            case targetGroupArn = "TargetGroupArn"
            case unhealthyThresholdCount = "UnhealthyThresholdCount"
        }
    }

    public struct ModifyTargetGroupOutput: AWSDecodableShape {
        /// Information about the modified target group.
        @OptionalCustomCoding<StandardArrayCoder>
        public var targetGroups: [TargetGroup]?

        public init(targetGroups: [TargetGroup]? = nil) {
            self.targetGroups = targetGroups
        }

        private enum CodingKeys: String, CodingKey {
            case targetGroups = "TargetGroups"
        }
    }

    public struct PathPatternConditionConfig: AWSEncodableShape & AWSDecodableShape {
        /// One or more path patterns to compare against the request URL. The maximum size of each string is 128 characters. The comparison is case sensitive. The following wildcard characters are supported: * (matches 0 or more characters) and ? (matches exactly 1 character). If you specify multiple strings, the condition is satisfied if one of them matches the request URL. The path pattern is compared only to the path of the URL, not to its query string. To compare against the query string, use QueryStringConditionConfig.
        @OptionalCustomCoding<StandardArrayCoder>
        public var values: [String]?

        public init(values: [String]? = nil) {
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case values = "Values"
        }
    }

    public struct QueryStringConditionConfig: AWSEncodableShape & AWSDecodableShape {
        /// One or more key/value pairs or values to find in the query string. The maximum size of each string is 128 characters. The comparison is case insensitive. The following wildcard characters are supported: * (matches 0 or more characters) and ? (matches exactly 1 character). To search for a literal '*' or '?' character in a query string, you must escape these characters in Values using a '\' character. If you specify multiple key/value pairs or values, the condition is satisfied if one of them is found in the query string.
        @OptionalCustomCoding<StandardArrayCoder>
        public var values: [QueryStringKeyValuePair]?

        public init(values: [QueryStringKeyValuePair]? = nil) {
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case values = "Values"
        }
    }

    public struct QueryStringKeyValuePair: AWSEncodableShape & AWSDecodableShape {
        /// The key. You can omit the key.
        public let key: String?
        /// The value.
        public let value: String?

        public init(key: String? = nil, value: String? = nil) {
            self.key = key
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case value = "Value"
        }
    }

    public struct RedirectActionConfig: AWSEncodableShape & AWSDecodableShape {
        /// The hostname. This component is not percent-encoded. The hostname can contain #{host}.
        public let host: String?
        /// The absolute path, starting with the leading "/". This component is not percent-encoded. The path can contain #{host}, #{path}, and #{port}.
        public let path: String?
        /// The port. You can specify a value from 1 to 65535 or #{port}.
        public let port: String?
        /// The protocol. You can specify HTTP, HTTPS, or #{protocol}. You can redirect HTTP to HTTP, HTTP to HTTPS, and HTTPS to HTTPS. You cannot redirect HTTPS to HTTP.
        public let `protocol`: String?
        /// The query parameters, URL-encoded when necessary, but not percent-encoded. Do not include the leading "?", as it is automatically added. You can specify any of the reserved keywords.
        public let query: String?
        /// The HTTP redirect code. The redirect is either permanent (HTTP 301) or temporary (HTTP 302).
        public let statusCode: RedirectActionStatusCodeEnum

        public init(host: String? = nil, path: String? = nil, port: String? = nil, protocol: String? = nil, query: String? = nil, statusCode: RedirectActionStatusCodeEnum) {
            self.host = host
            self.path = path
            self.port = port
            self.`protocol` = `protocol`
            self.query = query
            self.statusCode = statusCode
        }

        public func validate(name: String) throws {
            try self.validate(self.host, name: "host", parent: name, max: 128)
            try self.validate(self.host, name: "host", parent: name, min: 1)
            try self.validate(self.path, name: "path", parent: name, max: 128)
            try self.validate(self.path, name: "path", parent: name, min: 1)
            try self.validate(self.`protocol`, name: "`protocol`", parent: name, pattern: "^(HTTPS?|#\\{protocol\\})$")
            try self.validate(self.query, name: "query", parent: name, max: 128)
            try self.validate(self.query, name: "query", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case host = "Host"
            case path = "Path"
            case port = "Port"
            case `protocol` = "Protocol"
            case query = "Query"
            case statusCode = "StatusCode"
        }
    }

    public struct RegisterTargetsInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the target group.
        public let targetGroupArn: String
        /// The targets.
        @CustomCoding<StandardArrayCoder>
        public var targets: [TargetDescription]

        public init(targetGroupArn: String, targets: [TargetDescription]) {
            self.targetGroupArn = targetGroupArn
            self.targets = targets
        }

        public func validate(name: String) throws {
            try self.targets.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case targetGroupArn = "TargetGroupArn"
            case targets = "Targets"
        }
    }

    public struct RegisterTargetsOutput: AWSDecodableShape {
        public init() {}
    }

    public struct RemoveListenerCertificatesInput: AWSEncodableShape {
        /// The certificate to remove. You can specify one certificate per call. Set CertificateArn to the certificate ARN but do not set IsDefault.
        @CustomCoding<StandardArrayCoder>
        public var certificates: [Certificate]
        /// The Amazon Resource Name (ARN) of the listener.
        public let listenerArn: String

        public init(certificates: [Certificate], listenerArn: String) {
            self.certificates = certificates
            self.listenerArn = listenerArn
        }

        private enum CodingKeys: String, CodingKey {
            case certificates = "Certificates"
            case listenerArn = "ListenerArn"
        }
    }

    public struct RemoveListenerCertificatesOutput: AWSDecodableShape {
        public init() {}
    }

    public struct RemoveTagsInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the resource.
        @CustomCoding<StandardArrayCoder>
        public var resourceArns: [String]
        /// The tag keys for the tags to remove.
        @CustomCoding<StandardArrayCoder>
        public var tagKeys: [String]

        public init(resourceArns: [String], tagKeys: [String]) {
            self.resourceArns = resourceArns
            self.tagKeys = tagKeys
        }

        public func validate(name: String) throws {
            try self.tagKeys.forEach {
                try validate($0, name: "tagKeys[]", parent: name, max: 128)
                try validate($0, name: "tagKeys[]", parent: name, min: 1)
                try validate($0, name: "tagKeys[]", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArns = "ResourceArns"
            case tagKeys = "TagKeys"
        }
    }

    public struct RemoveTagsOutput: AWSDecodableShape {
        public init() {}
    }

    public struct Rule: AWSDecodableShape {
        /// The actions. Each rule must include exactly one of the following types of actions: forward, redirect, or fixed-response, and it must be the last action to be performed.
        @OptionalCustomCoding<StandardArrayCoder>
        public var actions: [Action]?
        /// The conditions. Each rule can include zero or one of the following conditions: http-request-method, host-header, path-pattern, and source-ip, and zero or more of the following conditions: http-header and query-string.
        @OptionalCustomCoding<StandardArrayCoder>
        public var conditions: [RuleCondition]?
        /// Indicates whether this is the default rule.
        public let isDefault: Bool?
        /// The priority.
        public let priority: String?
        /// The Amazon Resource Name (ARN) of the rule.
        public let ruleArn: String?

        public init(actions: [Action]? = nil, conditions: [RuleCondition]? = nil, isDefault: Bool? = nil, priority: String? = nil, ruleArn: String? = nil) {
            self.actions = actions
            self.conditions = conditions
            self.isDefault = isDefault
            self.priority = priority
            self.ruleArn = ruleArn
        }

        private enum CodingKeys: String, CodingKey {
            case actions = "Actions"
            case conditions = "Conditions"
            case isDefault = "IsDefault"
            case priority = "Priority"
            case ruleArn = "RuleArn"
        }
    }

    public struct RuleCondition: AWSEncodableShape & AWSDecodableShape {
        /// The field in the HTTP request. The following are the possible values:    http-header     http-request-method     host-header     path-pattern     query-string     source-ip
        public let field: String?
        /// Information for a host header condition. Specify only when Field is host-header.
        public let hostHeaderConfig: HostHeaderConditionConfig?
        /// Information for an HTTP header condition. Specify only when Field is http-header.
        public let httpHeaderConfig: HttpHeaderConditionConfig?
        /// Information for an HTTP method condition. Specify only when Field is http-request-method.
        public let httpRequestMethodConfig: HttpRequestMethodConditionConfig?
        /// Information for a path pattern condition. Specify only when Field is path-pattern.
        public let pathPatternConfig: PathPatternConditionConfig?
        /// Information for a query string condition. Specify only when Field is query-string.
        public let queryStringConfig: QueryStringConditionConfig?
        /// Information for a source IP condition. Specify only when Field is source-ip.
        public let sourceIpConfig: SourceIpConditionConfig?
        /// The condition value. Specify only when Field is host-header or path-pattern. Alternatively, to specify multiple host names or multiple path patterns, use HostHeaderConfig or PathPatternConfig. If Field is host-header and you are not using HostHeaderConfig, you can specify a single host name (for example, my.example.com) in Values. A host name is case insensitive, can be up to 128 characters in length, and can contain any of the following characters.   A-Z, a-z, 0-9   - .   * (matches 0 or more characters)   ? (matches exactly 1 character)   If Field is path-pattern and you are not using PathPatternConfig, you can specify a single path pattern (for example, /img/*) in Values. A path pattern is case-sensitive, can be up to 128 characters in length, and can contain any of the following characters.   A-Z, a-z, 0-9   _ - . $ / ~ " ' @ : +   &amp; (using &amp;amp;)   * (matches 0 or more characters)   ? (matches exactly 1 character)
        @OptionalCustomCoding<StandardArrayCoder>
        public var values: [String]?

        public init(field: String? = nil, hostHeaderConfig: HostHeaderConditionConfig? = nil, httpHeaderConfig: HttpHeaderConditionConfig? = nil, httpRequestMethodConfig: HttpRequestMethodConditionConfig? = nil, pathPatternConfig: PathPatternConditionConfig? = nil, queryStringConfig: QueryStringConditionConfig? = nil, sourceIpConfig: SourceIpConditionConfig? = nil, values: [String]? = nil) {
            self.field = field
            self.hostHeaderConfig = hostHeaderConfig
            self.httpHeaderConfig = httpHeaderConfig
            self.httpRequestMethodConfig = httpRequestMethodConfig
            self.pathPatternConfig = pathPatternConfig
            self.queryStringConfig = queryStringConfig
            self.sourceIpConfig = sourceIpConfig
            self.values = values
        }

        public func validate(name: String) throws {
            try self.validate(self.field, name: "field", parent: name, max: 64)
        }

        private enum CodingKeys: String, CodingKey {
            case field = "Field"
            case hostHeaderConfig = "HostHeaderConfig"
            case httpHeaderConfig = "HttpHeaderConfig"
            case httpRequestMethodConfig = "HttpRequestMethodConfig"
            case pathPatternConfig = "PathPatternConfig"
            case queryStringConfig = "QueryStringConfig"
            case sourceIpConfig = "SourceIpConfig"
            case values = "Values"
        }
    }

    public struct RulePriorityPair: AWSEncodableShape {
        /// The rule priority.
        public let priority: Int?
        /// The Amazon Resource Name (ARN) of the rule.
        public let ruleArn: String?

        public init(priority: Int? = nil, ruleArn: String? = nil) {
            self.priority = priority
            self.ruleArn = ruleArn
        }

        public func validate(name: String) throws {
            try self.validate(self.priority, name: "priority", parent: name, max: 50000)
            try self.validate(self.priority, name: "priority", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case priority = "Priority"
            case ruleArn = "RuleArn"
        }
    }

    public struct SetIpAddressTypeInput: AWSEncodableShape {
        /// The IP address type. The possible values are ipv4 (for IPv4 addresses) and dualstack (for IPv4 and IPv6 addresses). Internal load balancers must use ipv4. You can’t specify dualstack for a load balancer with a UDP or TCP_UDP listener.
        public let ipAddressType: IpAddressType
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String

        public init(ipAddressType: IpAddressType, loadBalancerArn: String) {
            self.ipAddressType = ipAddressType
            self.loadBalancerArn = loadBalancerArn
        }

        private enum CodingKeys: String, CodingKey {
            case ipAddressType = "IpAddressType"
            case loadBalancerArn = "LoadBalancerArn"
        }
    }

    public struct SetIpAddressTypeOutput: AWSDecodableShape {
        /// The IP address type.
        public let ipAddressType: IpAddressType?

        public init(ipAddressType: IpAddressType? = nil) {
            self.ipAddressType = ipAddressType
        }

        private enum CodingKeys: String, CodingKey {
            case ipAddressType = "IpAddressType"
        }
    }

    public struct SetRulePrioritiesInput: AWSEncodableShape {
        /// The rule priorities.
        @CustomCoding<StandardArrayCoder>
        public var rulePriorities: [RulePriorityPair]

        public init(rulePriorities: [RulePriorityPair]) {
            self.rulePriorities = rulePriorities
        }

        public func validate(name: String) throws {
            try self.rulePriorities.forEach {
                try $0.validate(name: "\(name).rulePriorities[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case rulePriorities = "RulePriorities"
        }
    }

    public struct SetRulePrioritiesOutput: AWSDecodableShape {
        /// Information about the rules.
        @OptionalCustomCoding<StandardArrayCoder>
        public var rules: [Rule]?

        public init(rules: [Rule]? = nil) {
            self.rules = rules
        }

        private enum CodingKeys: String, CodingKey {
            case rules = "Rules"
        }
    }

    public struct SetSecurityGroupsInput: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String
        /// The IDs of the security groups.
        @CustomCoding<StandardArrayCoder>
        public var securityGroups: [String]

        public init(loadBalancerArn: String, securityGroups: [String]) {
            self.loadBalancerArn = loadBalancerArn
            self.securityGroups = securityGroups
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerArn = "LoadBalancerArn"
            case securityGroups = "SecurityGroups"
        }
    }

    public struct SetSecurityGroupsOutput: AWSDecodableShape {
        /// The IDs of the security groups associated with the load balancer.
        @OptionalCustomCoding<StandardArrayCoder>
        public var securityGroupIds: [String]?

        public init(securityGroupIds: [String]? = nil) {
            self.securityGroupIds = securityGroupIds
        }

        private enum CodingKeys: String, CodingKey {
            case securityGroupIds = "SecurityGroupIds"
        }
    }

    public struct SetSubnetsInput: AWSEncodableShape {
        /// [Network Load Balancers] The type of IP addresses used by the subnets for your load balancer. The possible values are ipv4 (for IPv4 addresses) and dualstack (for IPv4 and IPv6 addresses). You can’t specify dualstack for a load balancer with a UDP or TCP_UDP listener. Internal load balancers must use ipv4.
        public let ipAddressType: IpAddressType?
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let loadBalancerArn: String
        /// The IDs of the public subnets. You can specify only one subnet per Availability Zone. You must specify either subnets or subnet mappings. [Application Load Balancers] You must specify subnets from at least two Availability Zones. You cannot specify Elastic IP addresses for your subnets. [Application Load Balancers on Outposts] You must specify one Outpost subnet. [Application Load Balancers on Local Zones] You can specify subnets from one or more Local Zones. [Network Load Balancers] You can specify subnets from one or more Availability Zones. You can specify one Elastic IP address per subnet if you need static IP addresses for your internet-facing load balancer. For internal load balancers, you can specify one private IP address per subnet from the IPv4 range of the subnet. For internet-facing load balancer, you can specify one IPv6 address per subnet.
        @OptionalCustomCoding<StandardArrayCoder>
        public var subnetMappings: [SubnetMapping]?
        /// The IDs of the public subnets. You can specify only one subnet per Availability Zone. You must specify either subnets or subnet mappings. [Application Load Balancers] You must specify subnets from at least two Availability Zones. [Application Load Balancers on Outposts] You must specify one Outpost subnet. [Application Load Balancers on Local Zones] You can specify subnets from one or more Local Zones. [Network Load Balancers] You can specify subnets from one or more Availability Zones.
        @OptionalCustomCoding<StandardArrayCoder>
        public var subnets: [String]?

        public init(ipAddressType: IpAddressType? = nil, loadBalancerArn: String, subnetMappings: [SubnetMapping]? = nil, subnets: [String]? = nil) {
            self.ipAddressType = ipAddressType
            self.loadBalancerArn = loadBalancerArn
            self.subnetMappings = subnetMappings
            self.subnets = subnets
        }

        private enum CodingKeys: String, CodingKey {
            case ipAddressType = "IpAddressType"
            case loadBalancerArn = "LoadBalancerArn"
            case subnetMappings = "SubnetMappings"
            case subnets = "Subnets"
        }
    }

    public struct SetSubnetsOutput: AWSDecodableShape {
        /// Information about the subnets.
        @OptionalCustomCoding<StandardArrayCoder>
        public var availabilityZones: [AvailabilityZone]?
        /// [Network Load Balancers] The IP address type.
        public let ipAddressType: IpAddressType?

        public init(availabilityZones: [AvailabilityZone]? = nil, ipAddressType: IpAddressType? = nil) {
            self.availabilityZones = availabilityZones
            self.ipAddressType = ipAddressType
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZones = "AvailabilityZones"
            case ipAddressType = "IpAddressType"
        }
    }

    public struct SourceIpConditionConfig: AWSEncodableShape & AWSDecodableShape {
        /// One or more source IP addresses, in CIDR format. You can use both IPv4 and IPv6 addresses. Wildcards are not supported. If you specify multiple addresses, the condition is satisfied if the source IP address of the request matches one of the CIDR blocks. This condition is not satisfied by the addresses in the X-Forwarded-For header. To search for addresses in the X-Forwarded-For header, use HttpHeaderConditionConfig.
        @OptionalCustomCoding<StandardArrayCoder>
        public var values: [String]?

        public init(values: [String]? = nil) {
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case values = "Values"
        }
    }

    public struct SslPolicy: AWSDecodableShape {
        /// The ciphers.
        @OptionalCustomCoding<StandardArrayCoder>
        public var ciphers: [Cipher]?
        /// The name of the policy.
        public let name: String?
        /// The protocols.
        @OptionalCustomCoding<StandardArrayCoder>
        public var sslProtocols: [String]?

        public init(ciphers: [Cipher]? = nil, name: String? = nil, sslProtocols: [String]? = nil) {
            self.ciphers = ciphers
            self.name = name
            self.sslProtocols = sslProtocols
        }

        private enum CodingKeys: String, CodingKey {
            case ciphers = "Ciphers"
            case name = "Name"
            case sslProtocols = "SslProtocols"
        }
    }

    public struct SubnetMapping: AWSEncodableShape {
        /// [Network Load Balancers] The allocation ID of the Elastic IP address for an internet-facing load balancer.
        public let allocationId: String?
        /// [Network Load Balancers] The IPv6 address.
        public let iPv6Address: String?
        /// [Network Load Balancers] The private IPv4 address for an internal load balancer.
        public let privateIPv4Address: String?
        /// The ID of the subnet.
        public let subnetId: String?

        public init(allocationId: String? = nil, iPv6Address: String? = nil, privateIPv4Address: String? = nil, subnetId: String? = nil) {
            self.allocationId = allocationId
            self.iPv6Address = iPv6Address
            self.privateIPv4Address = privateIPv4Address
            self.subnetId = subnetId
        }

        private enum CodingKeys: String, CodingKey {
            case allocationId = "AllocationId"
            case iPv6Address = "IPv6Address"
            case privateIPv4Address = "PrivateIPv4Address"
            case subnetId = "SubnetId"
        }
    }

    public struct Tag: AWSEncodableShape & AWSDecodableShape {
        /// The key of the tag.
        public let key: String
        /// The value of the tag.
        public let value: String?

        public init(key: String, value: String? = nil) {
            self.key = key
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 128)
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.validate(self.key, name: "key", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
            try self.validate(self.value, name: "value", parent: name, max: 256)
            try self.validate(self.value, name: "value", parent: name, min: 0)
            try self.validate(self.value, name: "value", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case value = "Value"
        }
    }

    public struct TagDescription: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the resource.
        public let resourceArn: String?
        /// Information about the tags.
        @OptionalCustomCoding<StandardArrayCoder>
        public var tags: [Tag]?

        public init(resourceArn: String? = nil, tags: [Tag]? = nil) {
            self.resourceArn = resourceArn
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArn = "ResourceArn"
            case tags = "Tags"
        }
    }

    public struct TargetDescription: AWSEncodableShape & AWSDecodableShape {
        /// An Availability Zone or all. This determines whether the target receives traffic from the load balancer nodes in the specified Availability Zone or from all enabled Availability Zones for the load balancer. This parameter is not supported if the target type of the target group is instance. If the target type is ip and the IP address is in a subnet of the VPC for the target group, the Availability Zone is automatically detected and this parameter is optional. If the IP address is outside the VPC, this parameter is required. With an Application Load Balancer, if the target type is ip and the IP address is outside the VPC for the target group, the only supported value is all. If the target type is lambda, this parameter is optional and the only supported value is all.
        public let availabilityZone: String?
        /// The ID of the target. If the target type of the target group is instance, specify an instance ID. If the target type is ip, specify an IP address. If the target type is lambda, specify the ARN of the Lambda function.
        public let id: String
        /// The port on which the target is listening. If the target group protocol is GENEVE, the supported port is 6081. Not used if the target is a Lambda function.
        public let port: Int?

        public init(availabilityZone: String? = nil, id: String, port: Int? = nil) {
            self.availabilityZone = availabilityZone
            self.id = id
            self.port = port
        }

        public func validate(name: String) throws {
            try self.validate(self.port, name: "port", parent: name, max: 65535)
            try self.validate(self.port, name: "port", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZone = "AvailabilityZone"
            case id = "Id"
            case port = "Port"
        }
    }

    public struct TargetGroup: AWSDecodableShape {
        /// Indicates whether health checks are enabled.
        public let healthCheckEnabled: Bool?
        /// The approximate amount of time, in seconds, between health checks of an individual target.
        public let healthCheckIntervalSeconds: Int?
        /// The destination for health checks on the targets.
        public let healthCheckPath: String?
        /// The port to use to connect with the target.
        public let healthCheckPort: String?
        /// The protocol to use to connect with the target. The GENEVE, TLS, UDP, and TCP_UDP protocols are not supported for health checks.
        public let healthCheckProtocol: ProtocolEnum?
        /// The amount of time, in seconds, during which no response means a failed health check.
        public let healthCheckTimeoutSeconds: Int?
        /// The number of consecutive health checks successes required before considering an unhealthy target healthy.
        public let healthyThresholdCount: Int?
        /// The Amazon Resource Names (ARN) of the load balancers that route traffic to this target group.
        @OptionalCustomCoding<StandardArrayCoder>
        public var loadBalancerArns: [String]?
        /// The HTTP or gRPC codes to use when checking for a successful response from a target.
        public let matcher: Matcher?
        /// The port on which the targets are listening. Not used if the target is a Lambda function.
        public let port: Int?
        /// The protocol to use for routing traffic to the targets.
        public let `protocol`: ProtocolEnum?
        /// [HTTP/HTTPS protocol] The protocol version. The possible values are GRPC, HTTP1, and HTTP2.
        public let protocolVersion: String?
        /// The Amazon Resource Name (ARN) of the target group.
        public let targetGroupArn: String?
        /// The name of the target group.
        public let targetGroupName: String?
        /// The type of target that you must specify when registering targets with this target group. The possible values are instance (register targets by instance ID), ip (register targets by IP address), or lambda (register a single Lambda function as a target).
        public let targetType: TargetTypeEnum?
        /// The number of consecutive health check failures required before considering the target unhealthy.
        public let unhealthyThresholdCount: Int?
        /// The ID of the VPC for the targets.
        public let vpcId: String?

        public init(healthCheckEnabled: Bool? = nil, healthCheckIntervalSeconds: Int? = nil, healthCheckPath: String? = nil, healthCheckPort: String? = nil, healthCheckProtocol: ProtocolEnum? = nil, healthCheckTimeoutSeconds: Int? = nil, healthyThresholdCount: Int? = nil, loadBalancerArns: [String]? = nil, matcher: Matcher? = nil, port: Int? = nil, protocol: ProtocolEnum? = nil, protocolVersion: String? = nil, targetGroupArn: String? = nil, targetGroupName: String? = nil, targetType: TargetTypeEnum? = nil, unhealthyThresholdCount: Int? = nil, vpcId: String? = nil) {
            self.healthCheckEnabled = healthCheckEnabled
            self.healthCheckIntervalSeconds = healthCheckIntervalSeconds
            self.healthCheckPath = healthCheckPath
            self.healthCheckPort = healthCheckPort
            self.healthCheckProtocol = healthCheckProtocol
            self.healthCheckTimeoutSeconds = healthCheckTimeoutSeconds
            self.healthyThresholdCount = healthyThresholdCount
            self.loadBalancerArns = loadBalancerArns
            self.matcher = matcher
            self.port = port
            self.`protocol` = `protocol`
            self.protocolVersion = protocolVersion
            self.targetGroupArn = targetGroupArn
            self.targetGroupName = targetGroupName
            self.targetType = targetType
            self.unhealthyThresholdCount = unhealthyThresholdCount
            self.vpcId = vpcId
        }

        private enum CodingKeys: String, CodingKey {
            case healthCheckEnabled = "HealthCheckEnabled"
            case healthCheckIntervalSeconds = "HealthCheckIntervalSeconds"
            case healthCheckPath = "HealthCheckPath"
            case healthCheckPort = "HealthCheckPort"
            case healthCheckProtocol = "HealthCheckProtocol"
            case healthCheckTimeoutSeconds = "HealthCheckTimeoutSeconds"
            case healthyThresholdCount = "HealthyThresholdCount"
            case loadBalancerArns = "LoadBalancerArns"
            case matcher = "Matcher"
            case port = "Port"
            case `protocol` = "Protocol"
            case protocolVersion = "ProtocolVersion"
            case targetGroupArn = "TargetGroupArn"
            case targetGroupName = "TargetGroupName"
            case targetType = "TargetType"
            case unhealthyThresholdCount = "UnhealthyThresholdCount"
            case vpcId = "VpcId"
        }
    }

    public struct TargetGroupAttribute: AWSEncodableShape & AWSDecodableShape {
        /// The name of the attribute. The following attribute is supported by all load balancers:    deregistration_delay.timeout_seconds - The amount of time, in seconds, for Elastic Load Balancing to wait before changing the state of a deregistering target from draining to unused. The range is 0-3600 seconds. The default value is 300 seconds. If the target is a Lambda function, this attribute is not supported.   The following attributes are supported by both Application Load Balancers and Network Load Balancers:    stickiness.enabled - Indicates whether sticky sessions are enabled. The value is true or false. The default is false.    stickiness.type - The type of sticky sessions. The possible values are lb_cookie and app_cookie for Application Load Balancers or source_ip for Network Load Balancers.   The following attributes are supported only if the load balancer is an Application Load Balancer and the target is an instance or an IP address:    load_balancing.algorithm.type - The load balancing algorithm determines how the load balancer selects targets when routing requests. The value is round_robin or least_outstanding_requests. The default is round_robin.    slow_start.duration_seconds - The time period, in seconds, during which a newly registered target receives an increasing share of the traffic to the target group. After this time period ends, the target receives its full share of traffic. The range is 30-900 seconds (15 minutes). The default is 0 seconds (disabled).    stickiness.app_cookie.cookie_name - Indicates the name of the application-based cookie. Names that start with the following names are not allowed: AWSALB, AWSALBAPP, and AWSALBTG. They're reserved for use by the load balancer.    stickiness.app_cookie.duration_seconds - The time period, in seconds, during which requests from a client should be routed to the same target. After this time period expires, the application-based cookie is considered stale. The range is 1 second to 1 week (604800 seconds). The default value is 1 day (86400 seconds).    stickiness.lb_cookie.duration_seconds - The time period, in seconds, during which requests from a client should be routed to the same target. After this time period expires, the load balancer-generated cookie is considered stale. The range is 1 second to 1 week (604800 seconds). The default value is 1 day (86400 seconds).   The following attribute is supported only if the load balancer is an Application Load Balancer and the target is a Lambda function:    lambda.multi_value_headers.enabled - Indicates whether the request and response headers that are exchanged between the load balancer and the Lambda function include arrays of values or strings. The value is true or false. The default is false. If the value is false and the request contains a duplicate header field name or query parameter key, the load balancer uses the last value sent by the client.   The following attributes are supported only by Network Load Balancers:    deregistration_delay.connection_termination.enabled - Indicates whether the load balancer terminates connections at the end of the deregistration timeout. The value is true or false. The default is false.    preserve_client_ip.enabled - Indicates whether client IP preservation is enabled. The value is true or false. The default is disabled if the target group type is IP address and the target group protocol is TCP or TLS. Otherwise, the default is enabled. Client IP preservation cannot be disabled for UDP and TCP_UDP target groups.    proxy_protocol_v2.enabled - Indicates whether Proxy Protocol version 2 is enabled. The value is true or false. The default is false.
        public let key: String?
        /// The value of the attribute.
        public let value: String?

        public init(key: String? = nil, value: String? = nil) {
            self.key = key
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 256)
            try self.validate(self.key, name: "key", parent: name, pattern: "^[a-zA-Z0-9._]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case value = "Value"
        }
    }

    public struct TargetGroupStickinessConfig: AWSEncodableShape & AWSDecodableShape {
        /// The time period, in seconds, during which requests from a client should be routed to the same target group. The range is 1-604800 seconds (7 days).
        public let durationSeconds: Int?
        /// Indicates whether target group stickiness is enabled.
        public let enabled: Bool?

        public init(durationSeconds: Int? = nil, enabled: Bool? = nil) {
            self.durationSeconds = durationSeconds
            self.enabled = enabled
        }

        private enum CodingKeys: String, CodingKey {
            case durationSeconds = "DurationSeconds"
            case enabled = "Enabled"
        }
    }

    public struct TargetGroupTuple: AWSEncodableShape & AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the target group.
        public let targetGroupArn: String?
        /// The weight. The range is 0 to 999.
        public let weight: Int?

        public init(targetGroupArn: String? = nil, weight: Int? = nil) {
            self.targetGroupArn = targetGroupArn
            self.weight = weight
        }

        private enum CodingKeys: String, CodingKey {
            case targetGroupArn = "TargetGroupArn"
            case weight = "Weight"
        }
    }

    public struct TargetHealth: AWSDecodableShape {
        /// A description of the target health that provides additional details. If the state is healthy, a description is not provided.
        public let description: String?
        /// The reason code. If the target state is healthy, a reason code is not provided. If the target state is initial, the reason code can be one of the following values:    Elb.RegistrationInProgress - The target is in the process of being registered with the load balancer.    Elb.InitialHealthChecking - The load balancer is still sending the target the minimum number of health checks required to determine its health status.   If the target state is unhealthy, the reason code can be one of the following values:    Target.ResponseCodeMismatch - The health checks did not return an expected HTTP code. Applies only to Application Load Balancers and Gateway Load Balancers.    Target.Timeout - The health check requests timed out. Applies only to Application Load Balancers and Gateway Load Balancers.    Target.FailedHealthChecks - The load balancer received an error while establishing a connection to the target or the target response was malformed.    Elb.InternalError - The health checks failed due to an internal error. Applies only to Application Load Balancers.   If the target state is unused, the reason code can be one of the following values:    Target.NotRegistered - The target is not registered with the target group.    Target.NotInUse - The target group is not used by any load balancer or the target is in an Availability Zone that is not enabled for its load balancer.    Target.InvalidState - The target is in the stopped or terminated state.    Target.IpUnusable - The target IP address is reserved for use by a load balancer.   If the target state is draining, the reason code can be the following value:    Target.DeregistrationInProgress - The target is in the process of being deregistered and the deregistration delay period has not expired.   If the target state is unavailable, the reason code can be the following value:    Target.HealthCheckDisabled - Health checks are disabled for the target group. Applies only to Application Load Balancers.    Elb.InternalError - Target health is unavailable due to an internal error. Applies only to Network Load Balancers.
        public let reason: TargetHealthReasonEnum?
        /// The state of the target.
        public let state: TargetHealthStateEnum?

        public init(description: String? = nil, reason: TargetHealthReasonEnum? = nil, state: TargetHealthStateEnum? = nil) {
            self.description = description
            self.reason = reason
            self.state = state
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case reason = "Reason"
            case state = "State"
        }
    }

    public struct TargetHealthDescription: AWSDecodableShape {
        /// The port to use to connect with the target.
        public let healthCheckPort: String?
        /// The description of the target.
        public let target: TargetDescription?
        /// The health information for the target.
        public let targetHealth: TargetHealth?

        public init(healthCheckPort: String? = nil, target: TargetDescription? = nil, targetHealth: TargetHealth? = nil) {
            self.healthCheckPort = healthCheckPort
            self.target = target
            self.targetHealth = targetHealth
        }

        private enum CodingKeys: String, CodingKey {
            case healthCheckPort = "HealthCheckPort"
            case target = "Target"
            case targetHealth = "TargetHealth"
        }
    }
}
